@@ -1651,6 +1651,45 @@ int ref_is_hidden(const char *refname, const char *refname_full)
return 0;
}
+#define OUR_REF (1u << 12)
+#define HIDDEN_REF (1u << 19)
+/*
+ * Use this flag to mark a ref that is hided by hide-refs hook, its private
+ * commits (tip or non-tip commits, not reachable by the refs not hided by
+ * hide-refs hook) will be force hidden to the client, which means client can
+ * not fetch such kind of commit even uploadpack.allowTipSHA1InWant or
+ * uploadpack.allowReachableSHA1InWant are set to true
+ */
+#define HIDDEN_REF_FORCE (1u << 20)
+
+static unsigned int ref_hidden_flag(const char *refname, const char *refname_full)
+{
+ if (ref_hidden_check(refname, refname_full, 1))
+ return HIDDEN_REF_FORCE;
+ else if (ref_hidden_check(refname, refname_full, 0))
+ return HIDDEN_REF;
+ return OUR_REF;
+}
+
+int mark_our_ref(const char *refname, const char *refname_full,
+ const struct object_id *oid)
+{
+ struct object *o;
+ unsigned int flag;
+
+ if (!oid || is_null_oid(oid)) {
+ return 0;
+ }
+
+ o = lookup_unknown_object(the_repository, oid);
+ flag = ref_hidden_flag(refname, refname_full);
+ o->flags |= flag;
+
+ if (flag & OUR_REF)
+ return 0;
+ return 1;
+}
+
const char *find_descendant_ref(const char *dirname,
const struct string_list *extras,
const struct string_list *skip)
@@ -819,6 +819,9 @@ int parse_hide_refs_config(const char *var, const char *value, const char *);
* parameter always points to the full ref name.
*/
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);
enum ref_type {
REF_TYPE_PER_WORKTREE, /* refs inside refs/ but not shared */
@@ -1155,20 +1155,6 @@ static void receive_needs(struct upload_pack_data *data,
packet_flush(1);
}
-/* return non-zero if the ref is hidden, otherwise 0 */
-static int mark_our_ref(const char *refname, const char *refname_full,
- const struct object_id *oid)
-{
- struct object *o = lookup_unknown_object(the_repository, oid);
-
- if (ref_is_hidden(refname, refname_full)) {
- o->flags |= HIDDEN_REF;
- return 1;
- }
- o->flags |= OUR_REF;
- return 0;
-}
-
static int check_ref(const char *refname_full, const struct object_id *oid,
int flag, void *cb_data)
{