@@ -84,7 +84,7 @@ static int send_ref(const char *refname, const struct object_id *oid,
strbuf_reset(&data->buf);
- if (ref_is_hidden(refname_nons, refname))
+ if (mark_our_ref(refname_nons, refname, oid))
return 0;
if (!ref_match(&data->prefixes, refname_nons))
@@ -1659,6 +1659,25 @@ int ref_is_hidden(const char *refname, const char *refname_full)
*/
#define HIDDEN_REF_FORCE (1u << 20)
+/* Use this variable to record existing object hidden flags */
+static unsigned int objects_hidden_flags;
+
+/* Return non-zero if need to batch check hidden refs, otherwise 0 */
+int need_check_hidden_refs(void)
+{
+ if (!objects_hidden_flags)
+ return 1;
+ return 0;
+}
+
+/* Return non-zero if some ref is force hidden, otherwise 0 */
+int has_force_hidden_refs(void)
+{
+ if (objects_hidden_flags & HIDDEN_REF_FORCE)
+ return 1;
+ return 0;
+}
+
static unsigned int ref_hidden_flag(const char *refname, const char *refname_full)
{
if (ref_hidden_check(refname, refname_full, 1))
@@ -1681,6 +1700,7 @@ int mark_our_ref(const char *refname, const char *refname_full,
o = lookup_unknown_object(the_repository, oid);
flag = ref_hidden_flag(refname, refname_full);
o->flags |= flag;
+ objects_hidden_flags |= flag;
if (flag & OUR_REF)
return 0;
@@ -822,6 +822,10 @@ int ref_is_hidden(const char *, const char *);
/* return non-zero if the ref is hidden, otherwise 0 */
int mark_our_ref(const char *refname, const char *refname_full,
const struct object_id *oid);
+/* return non-zero if need to batch check hidden refs, otherwise 0 */
+int need_check_hidden_refs(void);
+/* return non-zero if some ref is force hidden, otherwise 0 */
+int has_force_hidden_refs(void);
enum ref_type {
REF_TYPE_PER_WORKTREE, /* refs inside refs/ but not shared */
@@ -39,8 +39,8 @@
#define CLIENT_SHALLOW (1u << 18)
#define HIDDEN_REF (1u << 19)
-#define ALL_FLAGS (THEY_HAVE | OUR_REF | WANTED | COMMON_KNOWN | SHALLOW | \
- NOT_SHALLOW | CLIENT_SHALLOW | HIDDEN_REF)
+#define ALL_FLAGS (THEY_HAVE |WANTED | COMMON_KNOWN | SHALLOW | \
+ NOT_SHALLOW | CLIENT_SHALLOW)
/* Enum for allowed unadvertised object request (UOR) */
enum allow_uor {
@@ -1726,6 +1726,13 @@ int upload_pack_v2(struct repository *r, struct packet_reader *request)
state = FETCH_DONE;
break;
case FETCH_SEND_PACK:
+ if (need_check_hidden_refs()) {
+ head_ref_namespaced(check_ref, NULL);
+ for_each_namespaced_ref(check_ref, NULL);
+ }
+ if (has_force_hidden_refs())
+ check_non_tip(&data);
+
send_wanted_ref_info(&data);
send_shallow_info(&data);