Tidying up references code
cover Tidying up references code
From: Michael Haggerty <[email protected]>
This is the next installment of the reference changes that I have been working on. This batch includes a lot of tidying up in preparation for the real changes.
The last few patches have a little bit of meat on them. They start changing the innards of refs.c to work less with strings and more with objects. This work will continue in later patches with the ultimate goal of swapping the data structure used to store cached references out from under the module--changing it from a sorted array of pointers into a hierarchical tree shaped like the reference namespace tree.
This patch series should be applied on top of "[PATCH v3] Provide API to invalidate refs cache". It has textual dependencies on that patch series, though logically I don't think that they interact.
Michael Haggerty (14):
cache.h: add comments for git_path() and git_path_submodule() struct ref_list: document name member
refs.c: rename some local "refname" variables
refs: rename some parameters result -> sha1 clear_ref_list(): rename from free_ref_list() resolve_gitlink_ref(): improve docstring is_refname_available(): remove the "quiet" argument parse_ref_line(): add docstring
add_ref(): add docstring
is_dup_ref(): extract function from sort_ref_list()
refs: change signatures of get_packed_refs() and get_loose_refs() get_ref_dir(): change signature
Pass a (cached_refs *) to the resolve_gitlink_*() functions resolve_gitlink_ref_recursive(): change to work with struct
cached_refs
cache.h | 15 +++ refs.c | 418 +++++++++++++++++++++++++++++++++----------------------------- refs.h | 34 +++-- 3 files changed, 258 insertions(+), 209 deletions(-)
Signature · 1 line
1.7.7.rc2
PATCH 1/14 cache.h: add comments for git_path() and git_path_submodule()
From: Michael Haggerty <[email protected]>
--- cache.h | 15 +++++++++++++++ 1 files changed, 15 insertions(+), 0 deletions(-)
cache.h +15 -0
@@ -660,7 +660,22 @@ extern char *git_pathdup(const char *fmt, ...)/* Return a statically allocated filename matching the sha1 signature */ extern char *mkpath (const char *fmt, ...) __attribute__((format (printf,1 ,2 ))); + +/* +* Return the path of a file within get_git_dir(). The arguments +* should be printf-like arguments that produce the filename relative +* to get_git_dir(). Return the resulting path, or "/bad-path/" if +* there is an error. +*/ extern char *git_path (const char *fmt, ...) __attribute__((format (printf,1 ,2 ))); + +/* +* Return the path of a file within the submodule located at path. +* The other arguments should be printf-like arguments that produce +* the filename relative to "<path>/.git". If "<path>/.git" is a +* gitlink file, follow it to find the actual submodule git path. +* Return the resulting path, or "/bad-path/" if there is an error. +*/ extern char *git_path_submodule (const char *path,const char *fmt, ...) __attribute__((format (printf,2 ,3 )));
Signature · 1 line
1.7.7.rc2
Re: [PATCH 01/14] cache.h: add comments for git_path() and git_path_submodule()
cache.h extern char *git_pathdup(const char *fmt, ...) · line 670
Quoted 8 lines · [email protected] writes:
cache.h +7
-0+ +/* +* Return the path of a file within get_git_dir(). The arguments +* should be printf-like arguments that produce the filename relative +* to get_git_dir(). Return the resulting path, or "/bad-path/" if +* there is an error. +*/ extern char *git_path (const char *fmt, ...) __attribute__((format (printf,1 ,2 )));
Ok.
Quoted 2 lines
+/*
+ * Return the path of a file within the submodule located at path.
This is confusing. Does this "file within the submodule" refer to files like "Makefile" tracked in a submodule at "dir"? Your description for git_path() above makes it clear that the function is about files like "index" and "HEAD" that are part of the control information for the current project, but the above gives an impression that you are talking about files in the working tree of the submodule.
Quoted 2 lines
+ * The other arguments should be printf-like arguments that produce
+ * the filename relative to "<path>/.git". If "<path>/.git" is a
And the reader is puzzled by the sudden mention of <path>/.git here.
Quoted 5 lines
+ * gitlink file, follow it to find the actual submodule git path.
+ * Return the resulting path, or "/bad-path/" if there is an error.
+ */
extern char *git_path_submodule(const char *path, const char *fmt, ...)
__attribute__((format (printf, 2, 3)));
PATCH 2/14 struct ref_list: document name member
In reply to [email protected]From: Michael Haggerty <[email protected]>
--- refs.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
refs.c +1 -0
@@ -12,6 +12,7 @@ struct ref_entry {unsigned char flag;/* ISSYMREF? ISPACKED? */ unsigned char sha1[20 ];unsigned char peeled[20 ]; +/* The full name of the reference (e.g., "refs/heads/master"): */ char name[FLEX_ARRAY ]; };
Signature · 1 line
1.7.7.rc2
Re: [PATCH 02/14] struct ref_list: document name member
Quoted 13 lines · [email protected] writes:
From: Michael Haggerty <[email protected]>
Signed-off-by Michael Haggerty <[email protected]>--- refs.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)refs.c +0
-0
refs.c struct ref_entry { · line 17
Quoted 6 lines
refs.c +1
-0@@ -12,6 +12,7 @@ struct ref_entry {unsigned char flag;/* ISSYMREF? ISPACKED? */ unsigned char sha1[20 ];unsigned char peeled[20 ]; +/* The full name of the reference (e.g., "refs/heads/master"): */ char name[FLEX_ARRAY ]; };
Thanks. Needs retitling the patch, though.
PATCH 3/14 refs.c: rename some local "refname" variables
In reply to [email protected]From: Michael Haggerty <[email protected]>
Try to consistently use the variable name "refname" when referring to a string naming a reference.
--- refs.c | 276 +++++++++++++++++++++++++++++++++------------------------------- refs.h | 26 ++++--- 2 files changed, 157 insertions(+), 145 deletions(-)
refs.c +142 -134
@@ -49,7 +49,7 @@ static const char *parse_ref_line(char *line, unsigned char *sha1)return line; } -static void add_ref (const char *name,const unsigned char *sha1, +static void add_ref (const char *refname,const unsigned char *sha1,int flag,struct ref_array *refs,struct ref_entry **new_entry) {
@@ -57,13 +57,13 @@ static void add_ref(const char *name, const unsigned char *sha1,struct ref_entry *entry;/* Allocate it and add it in.. */ - len =strlen (name) +1 ; + len =strlen (refname) +1 ; entry =xmalloc (sizeof (struct ref_entry ) + len);hashcpy (entry->sha1, sha1);hashclr (entry->peeled); -if (check_refname_format (name,REFNAME_ALLOW_ONELEVEL |REFNAME_DOT_COMPONENT )) -die ("Reference has invalid format: '%s'" , name); -memcpy (entry->name, name, len); +if (check_refname_format (refname,REFNAME_ALLOW_ONELEVEL |REFNAME_DOT_COMPONENT )) +die ("Reference has invalid format: '%s'" , refname); +memcpy (entry->name, refname, len); entry->flag = flag;if (new_entry) *new_entry = entry;
@@ -106,20 +106,20 @@ static void sort_ref_array(struct ref_array *array) array->nr = i +1 ; } -static struct ref_entry *search_ref_array (struct ref_array *array,const char *name) +static struct ref_entry *search_ref_array (struct ref_array *array,const char *refname) {struct ref_entry *e, **r;int len; -if (name ==NULL ) +if (refname ==NULL )return NULL ;if (!array->nr)return NULL ; - len =strlen (name) +1 ; + len =strlen (refname) +1 ; e =xmalloc (sizeof (struct ref_entry ) + len); -memcpy (e->name, name, len); +memcpy (e->name, refname, len); r =bsearch (&e, array->refs, array->nr,sizeof (*array->refs), ref_entry_cmp);
@@ -223,7 +223,7 @@ static void read_packed_refs(FILE *f, struct ref_array *array)while (fgets (refline,sizeof (refline), f)) {unsigned char sha1[20 ]; -const char *name; +const char *refname;static const char header[] ="# pack-refs with:" ;if (!strncmp (refline, header,sizeof (header)-1 )) {
@@ -234,9 +234,9 @@ static void read_packed_refs(FILE *f, struct ref_array *array)continue ; } - name =parse_ref_line (refline, sha1); -if (name) { -add_ref (name, sha1, flag, array, &last); + refname =parse_ref_line (refline, sha1); +if (refname) { +add_ref (refname, sha1, flag, array, &last);continue ; } if (last &&
@@ -249,9 +249,9 @@ static void read_packed_refs(FILE *f, struct ref_array *array)sort_ref_array (array); } -void add_extra_ref (const char *name,const unsigned char *sha1,int flag) +void add_extra_ref (const char *refname,const unsigned char *sha1,int flag) { -add_ref (name, sha1, flag, &extra_refs,NULL ); +add_ref (refname, sha1, flag, &extra_refs,NULL ); }void clear_extra_refs (void )
@@ -397,7 +397,8 @@ static struct ref_array *get_loose_refs(const char *submodule)#define MAXDEPTH 5#define MAXREFLEN (1024) -static int resolve_gitlink_packed_ref (char *name,int pathlen,const char *refname,unsigned char *result) +static int resolve_gitlink_packed_ref (char *name,int pathlen, +const char *refname,unsigned char *result) {int retval =-1 ;struct ref_entry *ref;
@@ -411,7 +412,9 @@ static int resolve_gitlink_packed_ref(char *name, int pathlen, const char *refnareturn retval; } -static int resolve_gitlink_ref_recursive (char *name,int pathlen,const char *refname,unsigned char *result,int recursion) +static int resolve_gitlink_ref_recursive (char *name,int pathlen, +const char *refname,unsigned char *result, +int recursion) {int fd, len =strlen (refname);char buffer[128 ], *p;
@@ -478,10 +481,10 @@ int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *re* Try to read ref from the packed references. On success, set sha1 * and return 0; otherwise, return -1. */ -static int get_packed_ref (const char *ref,unsigned char *sha1) +static int get_packed_ref (const char *refname,unsigned char *sha1) {struct ref_array *packed =get_packed_refs (NULL ); -struct ref_entry *entry =search_ref_array (packed, ref); +struct ref_entry *entry =search_ref_array (packed, refname);if (entry) {hashcpy (sha1, entry->sha1);return 0 ;
@@ -489,18 +492,18 @@ static int get_packed_ref(const char *ref, unsigned char *sha1)return -1 ; } -const char *resolve_ref (const char *ref,unsigned char *sha1,int reading,int *flag) +const char *resolve_ref (const char *refname,unsigned char *sha1,int reading,int *flag) {int depth =MAXDEPTH ;ssize_t len;char buffer[256 ]; -static char ref_buffer[256 ]; +static char refname_buffer[256 ];char path[PATH_MAX ];if (flag) *flag =0 ; -if (check_refname_format (ref,REFNAME_ALLOW_ONELEVEL )) +if (check_refname_format (refname,REFNAME_ALLOW_ONELEVEL ))return NULL ;for (;;) {
@@ -511,7 +514,7 @@ const char *resolve_ref(const char *ref, unsigned char *sha1, int reading, int *if (--depth <0 )return NULL ; -git_snpath (path,sizeof (path),"%s" , ref); +git_snpath (path,sizeof (path),"%s" , refname);if (lstat (path, &st) <0 ) {if (errno !=ENOENT )
@@ -520,17 +523,17 @@ const char *resolve_ref(const char *ref, unsigned char *sha1, int reading, int ** The loose reference file does not exist; * check for a packed reference. */ -if (!get_packed_ref (ref, sha1)) { +if (!get_packed_ref (refname, sha1)) {if (flag) *flag |=REF_ISPACKED ; -return ref; +return refname; }/* The reference is not a packed reference, either. */ if (reading) {return NULL ; }else {hashclr (sha1); -return ref; +return refname; } }
@@ -542,8 +545,8 @@ const char *resolve_ref(const char *ref, unsigned char *sha1, int reading, int * buffer[len] =0 ;if (!prefixcmp (buffer,"refs/" ) && !check_refname_format (buffer,0 )) { -strcpy (ref_buffer, buffer); - ref = ref_buffer; +strcpy (refname_buffer, buffer); + refname = refname_buffer;if (flag) *flag |=REF_ISSYMREF ;continue ;
@@ -584,7 +587,7 @@ const char *resolve_ref(const char *ref, unsigned char *sha1, int reading, int * path);return NULL ; } - ref =strcpy (ref_buffer, buf); + refname =strcpy (refname_buffer, buf);if (flag) *flag |=REF_ISSYMREF ; }
@@ -593,7 +596,7 @@ const char *resolve_ref(const char *ref, unsigned char *sha1, int reading, int *warning ("reference in %s is formatted incorrectly" , path);return NULL ; } -return ref; +return refname; }/* The argument to filter_refs */
@@ -603,9 +606,9 @@ struct ref_filter {void *cb_data; }; -int read_ref (const char *ref,unsigned char *sha1) +int read_ref (const char *refname,unsigned char *sha1) { -if (resolve_ref (ref, sha1,1 ,NULL )) +if (resolve_ref (refname, sha1,1 ,NULL ))return 0 ;return -1 ; }
@@ -629,23 +632,23 @@ static int do_one_ref(const char *base, each_ref_fn fn, int trim,return fn (entry->name + trim, entry->sha1, entry->flag, cb_data); } -static int filter_refs (const char *ref,const unsigned char *sha,int flags, +static int filter_refs (const char *refname,const unsigned char *sha,int flags,void *data) {struct ref_filter *filter = (struct ref_filter *)data; -if (fnmatch (filter->pattern, ref,0 )) +if (fnmatch (filter->pattern, refname,0 ))return 0 ; -return filter->fn (ref, sha, flags, filter->cb_data); +return filter->fn (refname, sha, flags, filter->cb_data); } -int peel_ref (const char *ref,unsigned char *sha1) +int peel_ref (const char *refname,unsigned char *sha1) {int flag;unsigned char base[20 ];struct object *o; -if (current_ref && (current_ref->name == ref - || !strcmp (current_ref->name, ref))) { +if (current_ref && (current_ref->name == refname + || !strcmp (current_ref->name, refname))) {if (current_ref->flag &REF_KNOWS_PEELED ) {hashcpy (sha1, current_ref->peeled);return 0 ;
@@ -654,12 +657,12 @@ int peel_ref(const char *ref, unsigned char *sha1) goto fallback; } -if (!resolve_ref (ref, base,1 , &flag)) +if (!resolve_ref (refname, base,1 , &flag))return -1 ;if ((flag &REF_ISPACKED )) {struct ref_array *array =get_packed_refs (NULL ); -struct ref_entry *r =search_ref_array (array, ref); +struct ref_entry *r =search_ref_array (array, refname);if (r !=NULL && r->flag &REF_KNOWS_PEELED ) {hashcpy (sha1, r->peeled);
@@ -670,7 +673,7 @@ int peel_ref(const char *ref, unsigned char *sha1) fallback: o =parse_object (base);if (o && o->type ==OBJ_TAG ) { - o =deref_tag (o, ref,0 ); + o =deref_tag (o, refname,0 );if (o) {hashcpy (sha1, o->sha1);return 0 ;
@@ -900,16 +903,16 @@ static inline int bad_ref_char(int ch) }/* -* Try to read one refname component from the front of ref. Return +* Try to read one refname component from the front of refname. Return * the length of the component found, or -1 if the component is not * legal. */ -static int check_refname_component (const char *ref,int flags) +static int check_refname_component (const char *refname,int flags) {const char *cp;char last ='\0' ; -for (cp = ref; ; cp++) { +for (cp = refname; ; cp++) {char ch = *cp;if (ch =='\0' || ch =='/' )break ;
@@ -921,34 +924,34 @@ static int check_refname_component(const char *ref, int flags)return -1 ;/* Refname contains "@{". */ last = ch; } -if (cp == ref) +if (cp == refname)return -1 ;/* Component has zero length. */ -if (ref[0 ] =='.' ) { +if (refname[0 ] =='.' ) {if (!(flags &REFNAME_DOT_COMPONENT ))return -1 ;/* Component starts with '.'. */ /* * Even if leading dots are allowed, don't allow "." * as a component (".." is prevented by a rule above). */ -if (ref[1 ] =='\0' ) +if (refname[1 ] =='\0' )return -1 ;/* Component equals ".". */ } -if (cp - ref >=5 && !memcmp (cp -5 ,".lock" ,5 )) +if (cp - refname >=5 && !memcmp (cp -5 ,".lock" ,5 ))return -1 ;/* Refname ends with ".lock". */ -return cp - ref; +return cp - refname; } -int check_refname_format (const char *ref,int flags) +int check_refname_format (const char *refname,int flags) {int component_len, component_count =0 ;while (1 ) {/* We are at the start of a path component. */ - component_len =check_refname_component (ref, flags); + component_len =check_refname_component (refname, flags);if (component_len <0 ) {if ((flags &REFNAME_REFSPEC_PATTERN ) && - ref[0 ] =='*' && - (ref[1 ] =='\0' || ref[1 ] =='/' )) { + refname[0 ] =='*' && + (refname[1 ] =='\0' || refname[1 ] =='/' )) {/* Accept one wildcard as a full refname component. */ flags &= ~REFNAME_REFSPEC_PATTERN ; component_len =1 ;
@@ -957,13 +960,13 @@ int check_refname_format(const char *ref, int flags) } } component_count++; -if (ref[component_len] =='\0' ) +if (refname[component_len] =='\0' )break ;/* Skip to next component. */ - ref += component_len +1 ; + refname += component_len +1 ; } -if (ref[component_len -1 ] =='.' ) +if (refname[component_len -1 ] =='.' )return -1 ;/* Refname ends with '.'. */ if (!(flags &REFNAME_ALLOW_ONELEVEL ) && component_count <2 )return -1 ;/* Refname has only one component. */
@@ -1046,22 +1049,22 @@ static int remove_empty_directories(const char *file)return result; } -static int is_refname_available (const char *ref,const char *oldref, +static int is_refname_available (const char *refname,const char *oldrefname,struct ref_array *array,int quiet) { -int i, namlen =strlen (ref);/* e.g. 'foo/bar' */ +int i, namlen =strlen (refname);/* e.g. 'foo/bar' */ for (i =0 ; i < array->nr; i++ ) {struct ref_entry *entry = array->refs[i];/* entry->name could be 'foo' or 'foo/bar/baz' */ -if (!oldref ||strcmp (oldref, entry->name)) { +if (!oldrefname ||strcmp (oldrefname, entry->name)) {int len =strlen (entry->name);int cmplen = (namlen < len) ? namlen : len; -const char *lead = (namlen < len) ? entry->name : ref; -if (!strncmp (ref, entry->name, cmplen) && +const char *lead = (namlen < len) ? entry->name : refname; +if (!strncmp (refname, entry->name, cmplen) && lead[cmplen] =='/' ) {if (!quiet)error ("'%s' exists; cannot create '%s'" , - entry->name, ref); + entry->name, refname);return 0 ; } }
@@ -1069,10 +1072,12 @@ static int is_refname_available(const char *ref, const char *oldref,return 1 ; } -static struct ref_lock *lock_ref_sha1_basic (const char *ref,const unsigned char *old_sha1,int flags,int *type_p) +static struct ref_lock *lock_ref_sha1_basic (const char *refname, +const unsigned char *old_sha1, +int flags,int *type_p) {char *ref_file; -const char *orig_ref = ref; +const char *orig_refname = refname;struct ref_lock *lock;int last_errno =0 ;int type, lflags;
@@ -1082,27 +1087,27 @@ static struct ref_lock *lock_ref_sha1_basic(const char *ref, const unsigned char lock =xcalloc (1 ,sizeof (struct ref_lock )); lock->lock_fd =-1 ; - ref =resolve_ref (ref, lock->old_sha1, mustexist, &type); -if (!ref && errno ==EISDIR ) { + refname =resolve_ref (refname, lock->old_sha1, mustexist, &type); +if (!refname && errno ==EISDIR ) {/* we are trying to lock foo but we used to * have foo/bar which now does not exist; * it is normal for the empty directory 'foo' * to remain. */ - ref_file =git_path ("%s" , orig_ref); + ref_file =git_path ("%s" , orig_refname);if (remove_empty_directories (ref_file)) { last_errno = errno; -error ("there are still refs under '%s'" , orig_ref); +error ("there are still refs under '%s'" , orig_refname); goto error_return; } - ref =resolve_ref (orig_ref, lock->old_sha1, mustexist, &type); + refname =resolve_ref (orig_refname, lock->old_sha1, mustexist, &type); }if (type_p) *type_p = type; -if (!ref) { +if (!refname) { last_errno = errno;error ("unable to resolve reference %s: %s" , - orig_ref,strerror (errno)); + orig_refname,strerror (errno)); goto error_return; } missing =is_null_sha1 (lock->old_sha1);
@@ -1112,7 +1117,7 @@ static struct ref_lock *lock_ref_sha1_basic(const char *ref, const unsigned char* name is a proper prefix of our refname. */ if (missing && - !is_refname_available (ref,NULL ,get_packed_refs (NULL ),0 )) { + !is_refname_available (refname,NULL ,get_packed_refs (NULL ),0 )) { last_errno =ENOTDIR ; goto error_return; }
@@ -1121,12 +1126,12 @@ static struct ref_lock *lock_ref_sha1_basic(const char *ref, const unsigned char lflags =LOCK_DIE_ON_ERROR ;if (flags &REF_NODEREF ) { - ref = orig_ref; + refname = orig_refname; lflags |=LOCK_NODEREF ; } - lock->ref_name =xstrdup (ref); - lock->orig_ref_name =xstrdup (orig_ref); - ref_file =git_path ("%s" , ref); + lock->ref_name =xstrdup (refname); + lock->orig_ref_name =xstrdup (orig_refname); + ref_file =git_path ("%s" , refname);if (missing) lock->force_write =1 ;if ((flags &REF_NODEREF ) && (type &REF_ISSYMREF ))
@@ -1147,20 +1152,21 @@ static struct ref_lock *lock_ref_sha1_basic(const char *ref, const unsigned charreturn NULL ; } -struct ref_lock *lock_ref_sha1 (const char *ref,const unsigned char *old_sha1) +struct ref_lock *lock_ref_sha1 (const char *refname,const unsigned char *old_sha1) {char refpath[PATH_MAX ]; -if (check_refname_format (ref,0 )) +if (check_refname_format (refname,0 ))return NULL ; -strcpy (refpath,mkpath ("refs/%s" , ref)); +strcpy (refpath,mkpath ("refs/%s" , refname));return lock_ref_sha1_basic (refpath, old_sha1,0 ,NULL ); } -struct ref_lock *lock_any_ref_for_update (const char *ref,const unsigned char *old_sha1,int flags) +struct ref_lock *lock_any_ref_for_update (const char *refname, +const unsigned char *old_sha1,int flags) { -if (check_refname_format (ref,REFNAME_ALLOW_ONELEVEL )) +if (check_refname_format (refname,REFNAME_ALLOW_ONELEVEL ))return NULL ; -return lock_ref_sha1_basic (ref, old_sha1, flags,NULL ); +return lock_ref_sha1_basic (refname, old_sha1, flags,NULL ); }static struct lock_file packlock;
@@ -1246,30 +1252,30 @@ int delete_ref(const char *refname, const unsigned char *sha1, int delopt)*/ #define TMP_RENAMED_LOG "logs/refs/.tmp-renamed-log" -int rename_ref (const char *oldref,const char *newref,const char *logmsg) +int rename_ref (const char *oldrefname,const char *newrefname,const char *logmsg) {static const char renamed_ref[] ="RENAMED-REF" ;unsigned char sha1[20 ], orig_sha1[20 ];int flag =0 , logmoved =0 ;struct ref_lock *lock;struct stat loginfo; -int log = !lstat (git_path ("logs/%s" , oldref), &loginfo); +int log = !lstat (git_path ("logs/%s" , oldrefname), &loginfo);const char *symref =NULL ;if (log &&S_ISLNK (loginfo.st_mode)) -return error ("reflog for %s is a symlink" , oldref); +return error ("reflog for %s is a symlink" , oldrefname); - symref =resolve_ref (oldref, orig_sha1,1 , &flag); + symref =resolve_ref (oldrefname, orig_sha1,1 , &flag);if (flag &REF_ISSYMREF )return error ("refname %s is a symbolic ref, renaming it is not supported" , - oldref); + oldrefname);if (!symref) -return error ("refname %s not found" , oldref); +return error ("refname %s not found" , oldrefname); -if (!is_refname_available (newref, oldref,get_packed_refs (NULL ),0 )) +if (!is_refname_available (newrefname, oldrefname,get_packed_refs (NULL ),0 ))return 1 ; -if (!is_refname_available (newref, oldref,get_loose_refs (NULL ),0 )) +if (!is_refname_available (newrefname, oldrefname,get_loose_refs (NULL ),0 ))return 1 ; lock =lock_ref_sha1_basic (renamed_ref,NULL ,0 ,NULL );
@@ -1279,71 +1285,71 @@ int rename_ref(const char *oldref, const char *newref, const char *logmsg)if (write_ref_sha1 (lock, orig_sha1, logmsg))return error ("unable to save current sha1 in %s" , renamed_ref); -if (log &&rename (git_path ("logs/%s" , oldref),git_path (TMP_RENAMED_LOG ))) +if (log &&rename (git_path ("logs/%s" , oldrefname),git_path (TMP_RENAMED_LOG )))return error ("unable to move logfile logs/%s to " TMP_RENAMED_LOG ": %s" , - oldref,strerror (errno)); + oldrefname,strerror (errno)); -if (delete_ref (oldref, orig_sha1,REF_NODEREF )) { -error ("unable to delete old %s" , oldref); +if (delete_ref (oldrefname, orig_sha1,REF_NODEREF )) { +error ("unable to delete old %s" , oldrefname); goto rollback; } -if (resolve_ref (newref, sha1,1 , &flag) &&delete_ref (newref, sha1,REF_NODEREF )) { +if (resolve_ref (newrefname, sha1,1 , &flag) &&delete_ref (newrefname, sha1,REF_NODEREF )) {if (errno==EISDIR ) { -if (remove_empty_directories (git_path ("%s" , newref))) { -error ("Directory not empty: %s" , newref); +if (remove_empty_directories (git_path ("%s" , newrefname))) { +error ("Directory not empty: %s" , newrefname); goto rollback; } }else { -error ("unable to delete existing %s" , newref); +error ("unable to delete existing %s" , newrefname); goto rollback; } } -if (log &&safe_create_leading_directories (git_path ("logs/%s" , newref))) { -error ("unable to create directory for %s" , newref); +if (log &&safe_create_leading_directories (git_path ("logs/%s" , newrefname))) { +error ("unable to create directory for %s" , newrefname); goto rollback; } retry: -if (log &&rename (git_path (TMP_RENAMED_LOG ),git_path ("logs/%s" , newref))) { +if (log &&rename (git_path (TMP_RENAMED_LOG ),git_path ("logs/%s" , newrefname))) {if (errno==EISDIR || errno==ENOTDIR ) {/* * rename(a, b) when b is an existing * directory ought to result in ISDIR, but * Solaris 5.8 gives ENOTDIR. Sheesh. */ -if (remove_empty_directories (git_path ("logs/%s" , newref))) { -error ("Directory not empty: logs/%s" , newref); +if (remove_empty_directories (git_path ("logs/%s" , newrefname))) { +error ("Directory not empty: logs/%s" , newrefname); goto rollback; } goto retry; }else {error ("unable to move logfile " TMP_RENAMED_LOG " to logs/%s: %s" , - newref,strerror (errno)); + newrefname,strerror (errno)); goto rollback; } } logmoved = log; - lock =lock_ref_sha1_basic (newref,NULL ,0 ,NULL ); + lock =lock_ref_sha1_basic (newrefname,NULL ,0 ,NULL );if (!lock) { -error ("unable to lock %s for update" , newref); +error ("unable to lock %s for update" , newrefname); goto rollback; } lock->force_write =1 ;hashcpy (lock->old_sha1, orig_sha1);if (write_ref_sha1 (lock, orig_sha1, logmsg)) { -error ("unable to write current sha1 into %s" , newref); +error ("unable to write current sha1 into %s" , newrefname); goto rollback; }return 0 ; rollback: - lock =lock_ref_sha1_basic (oldref,NULL ,0 ,NULL ); + lock =lock_ref_sha1_basic (oldrefname,NULL ,0 ,NULL );if (!lock) { -error ("unable to lock %s for rollback" , oldref); +error ("unable to lock %s for rollback" , oldrefname); goto rollbacklog; }
@@ -1351,17 +1357,17 @@ int rename_ref(const char *oldref, const char *newref, const char *logmsg) flag = log_all_ref_updates; log_all_ref_updates =0 ;if (write_ref_sha1 (lock, orig_sha1,NULL )) -error ("unable to write current sha1 into %s" , oldref); +error ("unable to write current sha1 into %s" , oldrefname); log_all_ref_updates = flag; rollbacklog: -if (logmoved &&rename (git_path ("logs/%s" , newref),git_path ("logs/%s" , oldref))) +if (logmoved &&rename (git_path ("logs/%s" , newrefname),git_path ("logs/%s" , oldrefname)))error ("unable to restore logfile %s from %s: %s" , - oldref, newref,strerror (errno)); + oldrefname, newrefname,strerror (errno));if (!logmoved && log && -rename (git_path (TMP_RENAMED_LOG ),git_path ("logs/%s" , oldref))) +rename (git_path (TMP_RENAMED_LOG ),git_path ("logs/%s" , oldrefname)))error ("unable to restore logfile %s from " TMP_RENAMED_LOG ": %s" , - oldref,strerror (errno)); + oldrefname,strerror (errno));return 1 ; }
@@ -1418,16 +1424,16 @@ static int copy_msg(char *buf, const char *msg)return cp - buf; } -int log_ref_setup (const char *ref_name,char *logfile,int bufsize) +int log_ref_setup (const char *refname,char *logfile,int bufsize) {int logfd, oflags =O_APPEND |O_WRONLY ; -git_snpath (logfile, bufsize,"logs/%s" , ref_name); +git_snpath (logfile, bufsize,"logs/%s" , refname);if (log_all_ref_updates && - (!prefixcmp (ref_name,"refs/heads/" ) || - !prefixcmp (ref_name,"refs/remotes/" ) || - !prefixcmp (ref_name,"refs/notes/" ) || - !strcmp (ref_name,"HEAD" ))) { + (!prefixcmp (refname,"refs/heads/" ) || + !prefixcmp (refname,"refs/remotes/" ) || + !prefixcmp (refname,"refs/notes/" ) || + !strcmp (refname,"HEAD" ))) {if (safe_create_leading_directories (logfile) <0 )return error ("unable to create directory for %s" , logfile);
@@ -1457,7 +1463,7 @@ int log_ref_setup(const char *ref_name, char *logfile, int bufsize)return 0 ; } -static int log_ref_write (const char *ref_name,const unsigned char *old_sha1, +static int log_ref_write (const char *refname,const unsigned char *old_sha1,const unsigned char *new_sha1,const char *msg) {int logfd, result, written, oflags =O_APPEND |O_WRONLY ;
@@ -1470,7 +1476,7 @@ static int log_ref_write(const char *ref_name, const unsigned char *old_sha1,if (log_all_ref_updates <0 ) log_all_ref_updates = !is_bare_repository (); - result =log_ref_setup (ref_name, log_file,sizeof (log_file)); + result =log_ref_setup (refname, log_file,sizeof (log_file));if (result)return result;
@@ -1641,7 +1647,9 @@ static char *ref_msg(const char *line, const char *endp)return xmemdupz (line, ep - line); } -int read_ref_at (const char *ref,unsigned long at_time,int cnt,unsigned char *sha1,char **msg,unsigned long *cutoff_time,int *cutoff_tz,int *cutoff_cnt) +int read_ref_at (const char *refname,unsigned long at_time,int cnt, +unsigned char *sha1,char **msg, +unsigned long *cutoff_time,int *cutoff_tz,int *cutoff_cnt) {const char *logfile, *logdata, *logend, *rec, *lastgt, *lastrec;char *tz_c;
@@ -1652,7 +1660,7 @@ int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned char *void *log_mapped;size_t mapsz; - logfile =git_path ("logs/%s" , ref); + logfile =git_path ("logs/%s" , refname); logfd =open (logfile,O_RDONLY ,0 );if (logfd <0 )die_errno ("Unable to read log '%s'" , logfile);
@@ -1745,14 +1753,14 @@ int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned char *return 1 ; } -int for_each_recent_reflog_ent (const char *ref,each_reflog_ent_fn fn,long ofs,void *cb_data) +int for_each_recent_reflog_ent (const char *refname,each_reflog_ent_fn fn,long ofs,void *cb_data) {const char *logfile;FILE *logfp;struct strbuf sb =STRBUF_INIT ;int ret =0 ; - logfile =git_path ("logs/%s" , ref); + logfile =git_path ("logs/%s" , refname); logfp =fopen (logfile,"r" );if (!logfp)return -1 ;
@@ -1803,9 +1811,9 @@ int for_each_recent_reflog_ent(const char *ref, each_reflog_ent_fn fn, long ofs,return ret; } -int for_each_reflog_ent (const char *ref,each_reflog_ent_fn fn,void *cb_data) +int for_each_reflog_ent (const char *refname,each_reflog_ent_fn fn,void *cb_data) { -return for_each_recent_reflog_ent (ref, fn,0 , cb_data); +return for_each_recent_reflog_ent (refname, fn,0 , cb_data); }static int do_for_each_reflog (const char *base,each_ref_fn fn,void *cb_data)
@@ -1925,7 +1933,7 @@ static void gen_scanf_fmt(char *scanf_fmt, const char *rule)return ; } -char *shorten_unambiguous_ref (const char *ref,int strict) +char *shorten_unambiguous_ref (const char *refname,int strict) {int i;static char **scanf_fmts;
@@ -1954,10 +1962,10 @@ char *shorten_unambiguous_ref(const char *ref, int strict)/* bail out if there are no rules */ if (!nr_rules) -return xstrdup (ref); +return xstrdup (refname); -/* buffer for scanf result, at most ref must fit */ - short_name =xstrdup (ref); +/* buffer for scanf result, at most refname must fit */ + short_name =xstrdup (refname);/* skip first rule, it will always match */ for (i = nr_rules -1 ; i >0 ; --i) {
@@ -1965,7 +1973,7 @@ char *shorten_unambiguous_ref(const char *ref, int strict)int rules_to_fail = i;int short_name_len; -if (1 !=sscanf (ref, scanf_fmts[i], short_name)) +if (1 !=sscanf (refname, scanf_fmts[i], short_name))continue ; short_name_len =strlen (short_name);
@@ -2010,5 +2018,5 @@ char *shorten_unambiguous_ref(const char *ref, int strict) }free (short_name); -return xstrdup (ref); +return xstrdup (refname); }
refs.h +15 -11
@@ -59,14 +59,16 @@ extern void add_extra_ref(const char *refname, const unsigned char *sha1, int flextern void clear_extra_refs (void );extern int ref_exists (const char *); -extern int peel_ref (const char *,unsigned char *); +extern int peel_ref (const char *refname,unsigned char *sha1);/** Locks a "refs/" ref returning the lock on success and NULL on failure. **/ -extern struct ref_lock *lock_ref_sha1 (const char *ref,const unsigned char *old_sha1); +extern struct ref_lock *lock_ref_sha1 (const char *refname,const unsigned char *old_sha1);/** Locks any ref (for 'HEAD' type refs). */ #define REF_NODEREF 0x01 -extern struct ref_lock *lock_any_ref_for_update (const char *ref,const unsigned char *old_sha1,int flags); +extern struct ref_lock *lock_any_ref_for_update (const char *refname, +const unsigned char *old_sha1, +int flags);/** Close the file descriptor owned by a lock and return the status */ extern int close_ref (struct ref_lock *lock);
@@ -92,12 +94,14 @@ extern void invalidate_ref_cache(const char *submodule);int log_ref_setup (const char *ref_name,char *logfile,int bufsize);/** Reads log for the value of ref during at_time. **/ -extern int read_ref_at (const char *ref,unsigned long at_time,int cnt,unsigned char *sha1,char **msg,unsigned long *cutoff_time,int *cutoff_tz,int *cutoff_cnt); +extern int read_ref_at (const char *refname,unsigned long at_time,int cnt, +unsigned char *sha1,char **msg, +unsigned long *cutoff_time,int *cutoff_tz,int *cutoff_cnt);/* iterate over reflog entries */ typedef int each_reflog_ent_fn (unsigned char *osha1,unsigned char *nsha1,const char *,unsigned long ,int ,const char *,void *); -int for_each_reflog_ent (const char *ref,each_reflog_ent_fn fn,void *cb_data); -int for_each_recent_reflog_ent (const char *ref,each_reflog_ent_fn fn,long ,void *cb_data); +int for_each_reflog_ent (const char *refname,each_reflog_ent_fn fn,void *cb_data); +int for_each_recent_reflog_ent (const char *refname,each_reflog_ent_fn fn,long ,void *cb_data);/* * Calls the specified function for each reflog file until it returns nonzero,
@@ -110,9 +114,9 @@ extern int for_each_reflog(each_ref_fn, void *);#define REFNAME_DOT_COMPONENT 4/* -* Return 0 iff ref has the correct format for a refname according to -* the rules described in Documentation/git-check-ref-format.txt. If -* REFNAME_ALLOW_ONELEVEL is set in flags, then accept one-level +* Return 0 iff refname has the correct format for a refname according +* to the rules described in Documentation/git-check-ref-format.txt. +* If REFNAME_ALLOW_ONELEVEL is set in flags, then accept one-level * reference names. If REFNAME_REFSPEC_PATTERN is set in flags, then * allow a "*" wildcard character in place of one of the name * components. No leading or repeated slashes are accepted. If
@@ -120,10 +124,10 @@ extern int for_each_reflog(each_ref_fn, void *);* components to start with "." (but not a whole component equal to * "." or ".."). */ -extern int check_refname_format (const char *ref,int flags); +extern int check_refname_format (const char *refname,int flags);extern const char *prettify_refname (const char *refname); -extern char *shorten_unambiguous_ref (const char *ref,int strict); +extern char *shorten_unambiguous_ref (const char *refname,int strict);/** rename ref, return 0 on success **/ extern int rename_ref (const char *oldref,const char *newref,const char *logmsg);
Signature · 1 line
1.7.7.rc2
PATCH 4/14 refs: rename some parameters result -> sha1
In reply to [email protected]From: Michael Haggerty <[email protected]>
--- refs.c | 16 ++++++++-------- refs.h | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-)
refs.c +8 -8
@@ -398,7 +398,7 @@ static struct ref_array *get_loose_refs(const char *submodule)#define MAXREFLEN (1024)static int resolve_gitlink_packed_ref (char *name,int pathlen, -const char *refname,unsigned char *result) +const char *refname,unsigned char *sha1) {int retval =-1 ;struct ref_entry *ref;
@@ -406,14 +406,14 @@ static int resolve_gitlink_packed_ref(char *name, int pathlen, ref =search_ref_array (array, refname);if (ref !=NULL ) { -memcpy (result, ref->sha1,20 ); +memcpy (sha1, ref->sha1,20 ); retval =0 ; }return retval; }static int resolve_gitlink_ref_recursive (char *name,int pathlen, -const char *refname,unsigned char *result, +const char *refname,unsigned char *sha1,int recursion) {int fd, len =strlen (refname);
@@ -424,7 +424,7 @@ static int resolve_gitlink_ref_recursive(char *name, int pathlen,memcpy (name + pathlen, refname, len+1 ); fd =open (name,O_RDONLY );if (fd <0 ) -return resolve_gitlink_packed_ref (name, pathlen, refname, result); +return resolve_gitlink_packed_ref (name, pathlen, refname, sha1); len =read (fd, buffer,sizeof (buffer)-1 );close (fd);
@@ -435,7 +435,7 @@ static int resolve_gitlink_ref_recursive(char *name, int pathlen, buffer[len] =0 ;/* Was it a detached head or an old-fashioned symlink? */ -if (!get_sha1_hex (buffer, result)) +if (!get_sha1_hex (buffer, sha1))return 0 ;/* Symref? */
@@ -445,10 +445,10 @@ static int resolve_gitlink_ref_recursive(char *name, int pathlen,while (isspace (*p)) p++; -return resolve_gitlink_ref_recursive (name, pathlen, p, result, recursion+1 ); +return resolve_gitlink_ref_recursive (name, pathlen, p, sha1, recursion+1 ); } -int resolve_gitlink_ref (const char *path,const char *refname,unsigned char *result) +int resolve_gitlink_ref (const char *path,const char *refname,unsigned char *sha1) {int len =strlen (path), retval;char *gitdir;
@@ -472,7 +472,7 @@ int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *re } gitdir[len] ='/' ; gitdir[++len] ='\0' ; - retval =resolve_gitlink_ref_recursive (gitdir, len, refname, result,0 ); + retval =resolve_gitlink_ref_recursive (gitdir, len, refname, sha1,0 );free (gitdir);return retval; }
refs.h +1 -1
@@ -133,7 +133,7 @@ extern char *shorten_unambiguous_ref(const char *refname, int strict);extern int rename_ref (const char *oldref,const char *newref,const char *logmsg);/** resolve ref in nested "gitlink" repository */ -extern int resolve_gitlink_ref (const char *name,const char *refname,unsigned char *result); +extern int resolve_gitlink_ref (const char *name,const char *refname,unsigned char *sha1);/** lock a ref and then write its file */ enum action_on_err {MSG_ON_ERR ,DIE_ON_ERR ,QUIET_ON_ERR };
Signature · 1 line
1.7.7.rc2
Re: [PATCH 04/14] refs: rename some parameters result -> sha1
Quoted 4 lines · [email protected] writes:
From: Michael Haggerty <[email protected]>
Signed-off-by Michael Haggerty <[email protected]>
[PATCH 03/14] was about a similar topic and explained itself a lot better.
Even though it hinted as if it may be incomplete by saying "some" in the subject, it was clear from the description that it consistently renamed all the "name"s that are about references, not just "some" randomly chosen ones. It would have been better if the subject did not say "some" to avoid such implications.
Please give similar love to these sha1[] object names in this patch.
Quoted 88 lines
--- refs.c | 16 ++++++++-------- refs.h | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-)refs.c +8
-8@@ -398,7 +398,7 @@ static struct ref_array *get_loose_refs(const char *submodule)#define MAXREFLEN (1024)static int resolve_gitlink_packed_ref (char *name,int pathlen, -const char *refname,unsigned char *result) +const char *refname,unsigned char *sha1) {int retval =-1 ;struct ref_entry *ref;@@ -406,14 +406,14 @@ static int resolve_gitlink_packed_ref(char *name, int pathlen, ref =search_ref_array (array, refname);if (ref !=NULL ) { -memcpy (result, ref->sha1,20 ); +memcpy (sha1, ref->sha1,20 ); retval =0 ; }return retval; }static int resolve_gitlink_ref_recursive (char *name,int pathlen, -const char *refname,unsigned char *result, +const char *refname,unsigned char *sha1,int recursion) {int fd, len =strlen (refname);@@ -424,7 +424,7 @@ static int resolve_gitlink_ref_recursive(char *name, int pathlen,memcpy (name + pathlen, refname, len+1 ); fd =open (name,O_RDONLY );if (fd <0 ) -return resolve_gitlink_packed_ref (name, pathlen, refname, result); +return resolve_gitlink_packed_ref (name, pathlen, refname, sha1); len =read (fd, buffer,sizeof (buffer)-1 );close (fd);@@ -435,7 +435,7 @@ static int resolve_gitlink_ref_recursive(char *name, int pathlen, buffer[len] =0 ;/* Was it a detached head or an old-fashioned symlink? */ -if (!get_sha1_hex (buffer, result)) +if (!get_sha1_hex (buffer, sha1))return 0 ;/* Symref? */ @@ -445,10 +445,10 @@ static int resolve_gitlink_ref_recursive(char *name, int pathlen,while (isspace (*p)) p++; -return resolve_gitlink_ref_recursive (name, pathlen, p, result, recursion+1 ); +return resolve_gitlink_ref_recursive (name, pathlen, p, sha1, recursion+1 ); } -int resolve_gitlink_ref (const char *path,const char *refname,unsigned char *result) +int resolve_gitlink_ref (const char *path,const char *refname,unsigned char *sha1) {int len =strlen (path), retval;char *gitdir;@@ -472,7 +472,7 @@ int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *re } gitdir[len] ='/' ; gitdir[++len] ='\0' ; - retval =resolve_gitlink_ref_recursive (gitdir, len, refname, result,0 ); + retval =resolve_gitlink_ref_recursive (gitdir, len, refname, sha1,0 );free (gitdir);return retval; }refs.h +1
-1@@ -133,7 +133,7 @@ extern char *shorten_unambiguous_ref(const char *refname, int strict);extern int rename_ref (const char *oldref,const char *newref,const char *logmsg);/** resolve ref in nested "gitlink" repository */ -extern int resolve_gitlink_ref (const char *name,const char *refname,unsigned char *result); +extern int resolve_gitlink_ref (const char *name,const char *refname,unsigned char *sha1);/** lock a ref and then write its file */ enum action_on_err {MSG_ON_ERR ,DIE_ON_ERR ,QUIET_ON_ERR };
PATCH 5/14 clear_ref_list(): rename from free_ref_list()
In reply to [email protected]From: Michael Haggerty <[email protected]>
Rename the function since it doesn't actually free the array object that is passed to it.
--- refs.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-)
refs.c +4 -4
@@ -149,7 +149,7 @@ static struct ref_entry *current_ref;static struct ref_array extra_refs; -static void free_ref_array (struct ref_array *array) +static void clear_ref_array (struct ref_array *array) {int i;for (i =0 ; i < array->nr; i++)
@@ -162,14 +162,14 @@ static void free_ref_array(struct ref_array *array)static void clear_cached_packed_refs (struct cached_refs *refs) {if (refs->did_packed) -free_ref_array (&refs->packed); +clear_ref_array (&refs->packed); refs->did_packed =0 ; }static void clear_cached_loose_refs (struct cached_refs *refs) {if (refs->did_loose) -free_ref_array (&refs->loose); +clear_ref_array (&refs->loose); refs->did_loose =0 ; }
@@ -256,7 +256,7 @@ void add_extra_ref(const char *refname, const unsigned char *sha1, int flag)void clear_extra_refs (void ) { -free_ref_array (&extra_refs); +clear_ref_array (&extra_refs); }static struct ref_array *get_packed_refs (const char *submodule)
Signature · 1 line
1.7.7.rc2
Re: [PATCH 05/14] clear_ref_list(): rename from free_ref_list()
Quoted 4 lines · [email protected] writes:
From: Michael Haggerty <[email protected]>
Rename the function since it doesn't actually free the array object that is passed to it.
The commit log message correctly refers to the "array-ness" of the object being cleared. Needs retitling the patch to match.
Quoted 45 lines
Signed-off-by Michael Haggerty <[email protected]>--- refs.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-)refs.c +4
-4@@ -149,7 +149,7 @@ static struct ref_entry *current_ref;static struct ref_array extra_refs; -static void free_ref_array (struct ref_array *array) +static void clear_ref_array (struct ref_array *array) {int i;for (i =0 ; i < array->nr; i++)@@ -162,14 +162,14 @@ static void free_ref_array(struct ref_array *array)static void clear_cached_packed_refs (struct cached_refs *refs) {if (refs->did_packed) -free_ref_array (&refs->packed); +clear_ref_array (&refs->packed); refs->did_packed =0 ; }static void clear_cached_loose_refs (struct cached_refs *refs) {if (refs->did_loose) -free_ref_array (&refs->loose); +clear_ref_array (&refs->loose); refs->did_loose =0 ; }@@ -256,7 +256,7 @@ void add_extra_ref(const char *refname, const unsigned char *sha1, int flag)void clear_extra_refs (void ) { -free_ref_array (&extra_refs); +clear_ref_array (&extra_refs); }static struct ref_array *get_packed_refs (const char *submodule)
PATCH 6/14 resolve_gitlink_ref(): improve docstring
In reply to [email protected]From: Michael Haggerty <[email protected]>
--- refs.h | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-)
refs.h +5 -1
@@ -132,7 +132,11 @@ extern char *shorten_unambiguous_ref(const char *refname, int strict);/** rename ref, return 0 on success **/ extern int rename_ref (const char *oldref,const char *newref,const char *logmsg); -/** resolve ref in nested "gitlink" repository */ +/** +* Resolve refname in the nested "gitlink" repository that is located +* at name. If the resolution is successful, return 0 and set sha1 to +* the name of the object; otherwise, return a non-zero value. +*/ extern int resolve_gitlink_ref (const char *name,const char *refname,unsigned char *sha1);/** lock a ref and then write its file */
Signature · 1 line
1.7.7.rc2
Re: [PATCH 06/14] resolve_gitlink_ref(): improve docstring
refs.h extern char *shorten_unambiguous_ref(const char *refname, int strict); · line 139
Quoted 11 lines · [email protected] writes:
From: Michael Haggerty <[email protected]>
Signed-off-by Michael Haggerty <[email protected]>refs.h +5
-1-/** resolve ref in nested "gitlink" repository */ +/** +* Resolve refname in the nested "gitlink" repository that is located +* at name. If the resolution is successful, return 0 and set sha1 to +* the name of the object; otherwise, return a non-zero value. +*/
It is clear that "refname" would refer to things like "refs/heads/master", but "name" is still not clear enough with the description. 'repository that is located at name' hints that we may be dealing with more than one repository and 'name' is a way to identify which one, but perhaps "path" or "submodule" a much clearer way to indicate what the code is doing.
At the UI level, a submodule has "name" and "path" that are often the same but can be different (e.g. when the superproject moves a submodule that used to be bound to path "dir" to a different location, only the latter should change). I do not think resolve_gitlink_ref() takes the submodule name, but it takes the path to the submodule in the superproject. In that sense, "submodule_path" would be the clearest descriptive name for this parameter.
Quoted 1 line
extern int
resolve_gitlink_ref(const char *name, const char *refname, unsigned char *sha1);
PATCH 7/14 is_refname_available(): remove the "quiet" argument
In reply to [email protected]From: Michael Haggerty <[email protected]>
quiet was always set to 0, so get rid of it. Add a function docstring for good measure.
--- refs.c | 20 +++++++++++++------- 1 files changed, 13 insertions(+), 7 deletions(-)
refs.c +13 -7
@@ -1049,8 +1049,15 @@ static int remove_empty_directories(const char *file)return result; } +/* +* Return true iff a reference named refname could be created without +* conflicting with the name of an existing reference. If oldrefname +* is non-NULL, ignore potential conflicts with oldrefname (e.g., +* because oldrefname is scheduled for deletion in the same +* operation). +*/ static int is_refname_available (const char *refname,const char *oldrefname, -struct ref_array *array,int quiet) +struct ref_array *array) {int i, namlen =strlen (refname);/* e.g. 'foo/bar' */ for (i =0 ; i < array->nr; i++ ) {
@@ -1062,9 +1069,8 @@ static int is_refname_available(const char *refname, const char *oldrefname,const char *lead = (namlen < len) ? entry->name : refname;if (!strncmp (refname, entry->name, cmplen) && lead[cmplen] =='/' ) { -if (!quiet) -error ("'%s' exists; cannot create '%s'" , - entry->name, refname); +error ("'%s' exists; cannot create '%s'" , + entry->name, refname);return 0 ; } }
@@ -1117,7 +1123,7 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,* name is a proper prefix of our refname. */ if (missing && - !is_refname_available (refname,NULL ,get_packed_refs (NULL ),0 )) { + !is_refname_available (refname,NULL ,get_packed_refs (NULL ))) { last_errno =ENOTDIR ; goto error_return; }
@@ -1272,10 +1278,10 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logmsif (!symref)return error ("refname %s not found" , oldrefname); -if (!is_refname_available (newrefname, oldrefname,get_packed_refs (NULL ),0 )) +if (!is_refname_available (newrefname, oldrefname,get_packed_refs (NULL )))return 1 ; -if (!is_refname_available (newrefname, oldrefname,get_loose_refs (NULL ),0 )) +if (!is_refname_available (newrefname, oldrefname,get_loose_refs (NULL )))return 1 ; lock =lock_ref_sha1_basic (renamed_ref,NULL ,0 ,NULL );
Signature · 1 line
1.7.7.rc2
Re: [PATCH 07/14] is_refname_available(): remove the "quiet" argument
Quoted 4 lines · On Thu, 2011-10-13 at 09:58 +0200, [email protected] wrote:
From: Michael Haggerty <[email protected]>
quiet was always set to 0, so get rid of it. Add a function docstring for good measure.
I would like to know if perhaps it was an unfinished project somewhere to propagate the "quiet" option down to this level before removing the function argument. Comments?
Quoted 2 lines
+/*
+ * Return true iff a reference named refname could be created without
Did you really mean "iff" (as in "if and only if") or just plain "if" here?
Quoted 45 lines
+ * conflicting with the name of an existing reference. If oldrefname
+ * is non-NULL, ignore potential conflicts with oldrefname (e.g.,
+ * because oldrefname is scheduled for deletion in the same
+ * operation).
+ */
static int is_refname_available(const char *refname, const char *oldrefname,refs.c +6
-7- struct ref_array *array, int quiet) + struct ref_array *array) {int i, namlen =strlen (refname);/* e.g. 'foo/bar' */ for (i =0 ; i < array->nr; i++ ) {@@ -1062,9 +1069,8 @@ static int is_refname_available(const char *refname, const char *oldrefname,const char *lead = (namlen < len) ? entry->name : refname;if (!strncmp (refname, entry->name, cmplen) && lead[cmplen] =='/' ) { -if (!quiet) -error ("'%s' exists; cannot create '%s'" , - entry->name, refname); +error ("'%s' exists; cannot create '%s'" , + entry->name, refname);return 0 ; } }@@ -1117,7 +1123,7 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,* name is a proper prefix of our refname. */ if (missing && - !is_refname_available (refname,NULL ,get_packed_refs (NULL ),0 )) { + !is_refname_available (refname,NULL ,get_packed_refs (NULL ))) { last_errno =ENOTDIR ; goto error_return; }@@ -1272,10 +1278,10 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logmsif (!symref)return error ("refname %s not found" , oldrefname); -if (!is_refname_available (newrefname, oldrefname,get_packed_refs (NULL ),0 )) +if (!is_refname_available (newrefname, oldrefname,get_packed_refs (NULL )))return 1 ; -if (!is_refname_available (newrefname, oldrefname,get_loose_refs (NULL ),0 )) +if (!is_refname_available (newrefname, oldrefname,get_loose_refs (NULL )))return 1 ; lock =lock_ref_sha1_basic (renamed_ref,NULL ,0 ,NULL );
Signature · 4 lines
-Drew Northup ________________________________________________ "As opposed to vegetable or mineral error?" -John Pescatore, SANS NewsBites Vol. 12 Num. 59
Re: [PATCH 07/14] is_refname_available(): remove the "quiet" argument
Quoted 10 lines · Drew Northup
Quoted 4 lines · On Thu, 2011-10-13 at 09:58 +0200, [email protected] wrote:
From: Michael Haggerty <[email protected]>
quiet was always set to 0, so get rid of it. Add a function docstring for good measure.
I would like to know if perhaps it was an unfinished project somewhere to propagate the "quiet" option down to this level before removing the function argument. Comments?
The is_refname_available() function, including the quiet option, was added in c976d415e53 (coincidentally the same commit that added RENAME-REF). I am unable to find any use of the function with quiet=1 anywhere in history.
Quoted 5 lines
Quoted 2 lines
+/*
+ * Return true iff a reference named refname could be created withoutDid you really mean "iff" (as in "if and only if") or just plain "if" here?
I did indeed mean "if and only if". Are you asking because you think that abbreviation is too obscure, or because you think that "if and only if" is logically incorrect here and I should have used "if"?
Michael
Signature · 3 lines
Michael Haggerty [email protected] http://softwareswirl.blogspot.com/
Re: [PATCH 07/14] is_refname_available(): remove the "quiet" argument
In reply to Drew NorthupQuoted 9 lines · Drew Northup
Quoted 4 lines · On Thu, 2011-10-13 at 09:58 +0200, [email protected] wrote:
From: Michael Haggerty <[email protected]>
quiet was always set to 0, so get rid of it. Add a function docstring for good measure.
I would like to know if perhaps it was an unfinished project somewhere to propagate the "quiet" option down to this level before removing the function argument. Comments?
Have you tried blaming?
PATCH 8/14 parse_ref_line(): add docstring
In reply to [email protected]From: Michael Haggerty <[email protected]>
--- refs.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-)
refs.c +5 -0
@@ -21,6 +21,11 @@ struct ref_array {struct ref_entry **refs; }; +/* +* Parse one line from a packed-refs file. Return a pointer to the +* name within the line (null-terminated), or NULL if there is a +* problem. +*/ static const char *parse_ref_line (char *line,unsigned char *sha1) {/*
Signature · 1 line
1.7.7.rc2
PATCH 9/14 add_ref(): add docstring
In reply to [email protected]From: Michael Haggerty <[email protected]>
--- refs.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
refs.c +1 -0
@@ -54,6 +54,7 @@ static const char *parse_ref_line(char *line, unsigned char *sha1)return line; } +/* Add a ref_entry to the end of the ref_array (unsorted). */ static void add_ref (const char *refname,const unsigned char *sha1,int flag,struct ref_array *refs,struct ref_entry **new_entry)
Signature · 1 line
1.7.7.rc2
PATCH 10/14 is_dup_ref(): extract function from sort_ref_list()
In reply to [email protected]From: Michael Haggerty <[email protected]>
Giving it a name makes the code easier to understand. And the new function will be convenient later when it has to be called from multiple places.
--- refs.c | 27 +++++++++++++++++++++------ 1 files changed, 21 insertions(+), 6 deletions(-)
refs.c +21 -6
@@ -84,6 +84,25 @@ static int ref_entry_cmp(const void *a, const void *b)return strcmp (one->name, two->name); } +/* +* Emit a warning and return true iff ref1 and ref2 have the same name +* and the same sha1. Die if they have the same name but different +* sha1s. +*/ +static int is_dup_ref (const struct ref_entry *ref1,const struct ref_entry *ref2) +{ +if (!strcmp (ref1->name, ref2->name)) { +/* Duplicate name; make sure that the SHA1s match: */ +if (hashcmp (ref1->sha1, ref2->sha1)) +die ("Duplicated ref, and SHA1s don't match: %s" , + ref1->name); +warning ("Duplicated ref: %s" , ref1->name); +return 1 ; + }else { +return 0 ; + } +} +static void sort_ref_array (struct ref_array *array) {int i =0 , j =1 ;
@@ -94,15 +113,11 @@ static void sort_ref_array(struct ref_array *array)qsort (array->refs, array->nr,sizeof (*array->refs), ref_entry_cmp); -/* Remove any duplicates from the ref_array */ +/* Remove any duplicates from the ref_list */ for (; j < array->nr; j++) {struct ref_entry *a = array->refs[i];struct ref_entry *b = array->refs[j]; -if (!strcmp (a->name, b->name)) { -if (hashcmp (a->sha1, b->sha1)) -die ("Duplicated ref, and SHA1s don't match: %s" , - a->name); -warning ("Duplicated ref: %s" , a->name); +if (is_dup_ref (a, b)) {free (b);continue ; }
Signature · 1 line
1.7.7.rc2
Re: [PATCH 10/14] is_dup_ref(): extract function from sort_ref_list()
refs.c static void sort_ref_array(struct ref_array *array) · line 116
Quoted 7 lines · [email protected] writes:
...
refs.c +1
-1@@ -94,15 +113,11 @@ static void sort_ref_array(struct ref_array *array)qsort (array->refs, array->nr,sizeof (*array->refs), ref_entry_cmp); -/* Remove any duplicates from the ref_array */ +/* Remove any duplicates from the ref_list */
Eh... Also needs retitled.
Quoted 12 lines
refs.c +1
-5for (; j < array->nr; j++) {struct ref_entry *a = array->refs[i];struct ref_entry *b = array->refs[j]; -if (!strcmp (a->name, b->name)) { -if (hashcmp (a->sha1, b->sha1)) -die ("Duplicated ref, and SHA1s don't match: %s" , - a->name); -warning ("Duplicated ref: %s" , a->name); +if (is_dup_ref (a, b)) {free (b);continue ; }
PATCH 11/14 refs: change signatures of get_packed_refs() and get_loose_refs()
In reply to [email protected]From: Michael Haggerty <[email protected]>
Change get_packed_refs() and get_loose_refs() to take a (struct cached_refs *) instead of the name of the submodule.
Change get_ref_dir() to take a submodule name (i.e., "" for the main module) rather than a submodule pointer (i.e., NULL for the main module) so that refs->name can be used as its argument. (In a moment this function will also be changed to take a (struct cached_refs *), too.)
--- refs.c | 36 +++++++++++++++++------------------- 1 files changed, 17 insertions(+), 19 deletions(-)
refs.c +17 -19
@@ -280,16 +280,14 @@ void clear_extra_refs(void)clear_ref_array (&extra_refs); } -static struct ref_array *get_packed_refs (const char *submodule) +static struct ref_array *get_packed_refs (struct cached_refs *refs) { -struct cached_refs *refs =get_cached_refs (submodule); -if (!refs->did_packed) {const char *packed_refs_file;FILE *f; -if (submodule) - packed_refs_file =git_path_submodule (submodule,"packed-refs" ); +if (*refs->name) + packed_refs_file =git_path_submodule (refs->name,"packed-refs" );else packed_refs_file =git_path ("packed-refs" ); f =fopen (packed_refs_file,"r" );
@@ -308,7 +306,7 @@ static void get_ref_dir(const char *submodule, const char *base,DIR *dir;const char *path; -if (submodule) +if (*submodule) path =git_path_submodule (submodule,"%s" , base);else path =git_path ("%s" , base);
@@ -402,12 +400,10 @@ void warn_dangling_symref(FILE *fp, const char *msg_fmt, const char *refname)for_each_rawref (warn_if_dangling_symref, &data); } -static struct ref_array *get_loose_refs (const char *submodule) +static struct ref_array *get_loose_refs (struct cached_refs *refs) { -struct cached_refs *refs =get_cached_refs (submodule); -if (!refs->did_loose) { -get_ref_dir (submodule,"refs" , &refs->loose); +get_ref_dir (refs->name,"refs" , &refs->loose);sort_ref_array (&refs->loose); refs->did_loose =1 ; }
@@ -423,7 +419,7 @@ static int resolve_gitlink_packed_ref(char *name, int pathlen, {int retval =-1 ;struct ref_entry *ref; -struct ref_array *array =get_packed_refs (name); +struct ref_array *array =get_packed_refs (get_cached_refs (name)); ref =search_ref_array (array, refname);if (ref !=NULL ) {
@@ -504,7 +500,7 @@ int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sh*/ static int get_packed_ref (const char *refname,unsigned char *sha1) { -struct ref_array *packed =get_packed_refs (NULL ); +struct ref_array *packed =get_packed_refs (get_cached_refs (NULL ));struct ref_entry *entry =search_ref_array (packed, refname);if (entry) {hashcpy (sha1, entry->sha1);
@@ -682,7 +678,7 @@ int peel_ref(const char *refname, unsigned char *sha1)return -1 ;if ((flag &REF_ISPACKED )) { -struct ref_array *array =get_packed_refs (NULL ); +struct ref_array *array =get_packed_refs (get_cached_refs (NULL ));struct ref_entry *r =search_ref_array (array, refname);if (r !=NULL && r->flag &REF_KNOWS_PEELED ) {
@@ -707,8 +703,9 @@ static int do_for_each_ref(const char *submodule, const char *base, each_ref_fn int trim, int flags, void *cb_data) { int retval = 0, i, p = 0, l = 0; -struct ref_array *packed =get_packed_refs (submodule); -struct ref_array *loose =get_loose_refs (submodule); +struct cached_refs *refs =get_cached_refs (submodule); +struct ref_array *packed =get_packed_refs (refs); +struct ref_array *loose =get_loose_refs (refs);struct ref_array *extra = &extra_refs;
@@ -1144,7 +1141,7 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,* name is a proper prefix of our refname. */ if (missing && - !is_refname_available (refname,NULL ,get_packed_refs (NULL ))) { + !is_refname_available (refname,NULL ,get_packed_refs (get_cached_refs (NULL )))) { last_errno =ENOTDIR ; goto error_return; }
@@ -1204,7 +1201,7 @@ static int repack_without_ref(const char *refname)struct ref_entry *ref;int fd, i; - packed =get_packed_refs (NULL ); + packed =get_packed_refs (get_cached_refs (NULL )); ref =search_ref_array (packed, refname);if (ref ==NULL )return 0 ;
@@ -1288,6 +1285,7 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logmsstruct stat loginfo;int log = !lstat (git_path ("logs/%s" , oldrefname), &loginfo);const char *symref =NULL ; +struct cached_refs *refs =get_cached_refs (NULL );if (log &&S_ISLNK (loginfo.st_mode))return error ("reflog for %s is a symlink" , oldrefname);
@@ -1299,10 +1297,10 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logmsif (!symref)return error ("refname %s not found" , oldrefname); -if (!is_refname_available (newrefname, oldrefname,get_packed_refs (NULL ))) +if (!is_refname_available (newrefname, oldrefname,get_packed_refs (refs)))return 1 ; -if (!is_refname_available (newrefname, oldrefname,get_loose_refs (NULL ))) +if (!is_refname_available (newrefname, oldrefname,get_loose_refs (refs)))return 1 ; lock =lock_ref_sha1_basic (renamed_ref,NULL ,0 ,NULL );
Signature · 1 line
1.7.7.rc2
PATCH 12/14 get_ref_dir(): change signature
In reply to [email protected]From: Michael Haggerty <[email protected]>
Change get_ref_dir() to take a (struct cached_refs *) in place of the submodule name.
--- refs.c | 18 +++++++++--------- 1 files changed, 9 insertions(+), 9 deletions(-)
refs.c +9 -9
@@ -300,14 +300,14 @@ static struct ref_array *get_packed_refs(struct cached_refs *refs)return &refs->packed; } -static void get_ref_dir (const char *submodule,const char *base, +static void get_ref_dir (struct cached_refs *refs,const char *base,struct ref_array *array) {DIR *dir;const char *path; -if (*submodule) - path =git_path_submodule (submodule,"%s" , base); +if (*refs->name) + path =git_path_submodule (refs->name,"%s" , base);else path =git_path ("%s" , base);
@@ -338,19 +338,19 @@ static void get_ref_dir(const char *submodule, const char *base,if (has_extension (de->d_name,".lock" ))continue ;memcpy (ref + baselen, de->d_name, namelen+1 ); - refdir = submodule - ?git_path_submodule (submodule,"%s" , ref) + refdir = *refs->name + ?git_path_submodule (refs->name,"%s" , ref) :git_path ("%s" , ref);if (stat (refdir, &st) <0 )continue ;if (S_ISDIR (st.st_mode)) { -get_ref_dir (submodule, ref, array); +get_ref_dir (refs, ref, array);continue ; } -if (submodule) { +if (*refs->name) {hashclr (sha1); flag =0 ; -if (resolve_gitlink_ref (submodule, ref, sha1) <0 ) { +if (resolve_gitlink_ref (refs->name, ref, sha1) <0 ) {hashclr (sha1); flag |=REF_BROKEN ; }
@@ -403,7 +403,7 @@ void warn_dangling_symref(FILE *fp, const char *msg_fmt, const char *refname)static struct ref_array *get_loose_refs (struct cached_refs *refs) {if (!refs->did_loose) { -get_ref_dir (refs->name,"refs" , &refs->loose); +get_ref_dir (refs,"refs" , &refs->loose);sort_ref_array (&refs->loose); refs->did_loose =1 ; }
Signature · 1 line
1.7.7.rc2
PATCH 13/14 Pass a (cached_refs *) to the resolve_gitlink_*() functions
In reply to [email protected]From: Michael Haggerty <[email protected]>
And remove some redundant arguments from resolve_gitlink_packed_ref().
--- refs.c | 20 +++++++++++++------- 1 files changed, 13 insertions(+), 7 deletions(-)
refs.c +13 -7
@@ -414,12 +414,12 @@ static struct ref_array *get_loose_refs(struct cached_refs *refs)#define MAXDEPTH 5#define MAXREFLEN (1024) -static int resolve_gitlink_packed_ref (char *name,int pathlen, +static int resolve_gitlink_packed_ref (struct cached_refs *refs,const char *refname,unsigned char *sha1) {int retval =-1 ;struct ref_entry *ref; -struct ref_array *array =get_packed_refs (get_cached_refs (name)); +struct ref_array *array =get_packed_refs (refs); ref =search_ref_array (array, refname);if (ref !=NULL ) {
@@ -429,7 +429,8 @@ static int resolve_gitlink_packed_ref(char *name, int pathlen,return retval; } -static int resolve_gitlink_ref_recursive (char *name,int pathlen, +static int resolve_gitlink_ref_recursive (struct cached_refs *refs, +char *name,int pathlen,const char *refname,unsigned char *sha1,int recursion) {
@@ -441,7 +442,7 @@ static int resolve_gitlink_ref_recursive(char *name, int pathlen,memcpy (name + pathlen, refname, len+1 ); fd =open (name,O_RDONLY );if (fd <0 ) -return resolve_gitlink_packed_ref (name, pathlen, refname, sha1); +return resolve_gitlink_packed_ref (refs, refname, sha1); len =read (fd, buffer,sizeof (buffer)-1 );close (fd);
@@ -462,19 +463,24 @@ static int resolve_gitlink_ref_recursive(char *name, int pathlen,while (isspace (*p)) p++; -return resolve_gitlink_ref_recursive (name, pathlen, p, sha1, recursion+1 ); +return resolve_gitlink_ref_recursive (refs, name, pathlen, p, sha1, recursion+1 ); }int resolve_gitlink_ref (const char *path,const char *refname,unsigned char *sha1) {int len =strlen (path), retval; -char *gitdir; +char *submodule, *gitdir; +struct cached_refs *refs;const char *tmp;while (len && path[len-1 ] =='/' ) len--;if (!len)return -1 ; + submodule =xstrndup (path, len); + refs =get_cached_refs (submodule); +free (submodule); + gitdir =xmalloc (len +MAXREFLEN +8 );memcpy (gitdir, path, len);memcpy (gitdir + len,"/.git" ,6 );
@@ -489,7 +495,7 @@ int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sh } gitdir[len] ='/' ; gitdir[++len] ='\0' ; - retval =resolve_gitlink_ref_recursive (gitdir, len, refname, sha1,0 ); + retval =resolve_gitlink_ref_recursive (refs, gitdir, len, refname, sha1,0 );free (gitdir);return retval; }
Signature · 1 line
1.7.7.rc2
PATCH 14/14 resolve_gitlink_ref_recursive(): change to work with struct cached_refs
In reply to [email protected]From: Michael Haggerty <[email protected]>
resolve_gitlink_ref() and resolve_gitlink_ref_recursive(), together, basically duplicated the code in git_path_submodule(). So use that function instead.
--- refs.c | 34 ++++++++++------------------------ 1 files changed, 10 insertions(+), 24 deletions(-)
refs.c +10 -24
@@ -430,17 +430,19 @@ static int resolve_gitlink_packed_ref(struct cached_refs *refs, }static int resolve_gitlink_ref_recursive (struct cached_refs *refs, -char *name,int pathlen,const char *refname,unsigned char *sha1,int recursion) { -int fd, len =strlen (refname); +int fd, len;char buffer[128 ], *p; +char *path; -if (recursion >MAXDEPTH || len >MAXREFLEN ) +if (recursion >MAXDEPTH ||strlen (refname) >MAXREFLEN )return -1 ; -memcpy (name + pathlen, refname, len+1 ); - fd =open (name,O_RDONLY ); + path = *refs->name + ?git_path_submodule (refs->name,"%s" , refname) + :git_path ("%s" , refname); + fd =open (path,O_RDONLY );if (fd <0 )return resolve_gitlink_packed_ref (refs, refname, sha1);
@@ -463,15 +465,14 @@ static int resolve_gitlink_ref_recursive(struct cached_refs *refs,while (isspace (*p)) p++; -return resolve_gitlink_ref_recursive (refs, name, pathlen, p, sha1, recursion+1 ); +return resolve_gitlink_ref_recursive (refs, p, sha1, recursion+1 ); }int resolve_gitlink_ref (const char *path,const char *refname,unsigned char *sha1) {int len =strlen (path), retval; -char *submodule, *gitdir; +char *submodule;struct cached_refs *refs; -const char *tmp;while (len && path[len-1 ] =='/' ) len--;
@@ -481,22 +482,7 @@ int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sh refs =get_cached_refs (submodule);free (submodule); - gitdir =xmalloc (len +MAXREFLEN +8 ); -memcpy (gitdir, path, len); -memcpy (gitdir + len,"/.git" ,6 ); - len +=5 ; - - tmp =read_gitfile (gitdir); -if (tmp) { -free (gitdir); - len =strlen (tmp); - gitdir =xmalloc (len +MAXREFLEN +3 ); -memcpy (gitdir, tmp, len); - } - gitdir[len] ='/' ; - gitdir[++len] ='\0' ; - retval =resolve_gitlink_ref_recursive (refs, gitdir, len, refname, sha1,0 ); -free (gitdir); + retval =resolve_gitlink_ref_recursive (refs, refname, sha1,0 );return retval; }
Signature · 1 line
1.7.7.rc2
PATCH 1/1 t1402-check-ref-format: skip tests of refs beginning with slash on Windows
In reply to [email protected]From: Johannes Sixt <[email protected]>
Bash on Windows converts program arguments that look like absolute POSIX paths to their Windows form, i.e., drive-letter-colon format. For this reason, those tests in t1402 that check refs that begin with a slash do not work as expected on Windows: valid_ref tests are doomed to fail, and invalid_ref tests fail for the wrong reason (that there is a colon rather than that they begin with a slash).
Skip these tests.
---
Am 10/13/2011 9:58, schrieb [email protected]:
Quoted 5 lines
From: Michael Haggerty <[email protected]>
This is the next installment of the reference changes that I have been working on. This batch includes a lot of tidying up in preparation for the real changes.
This patch is needed on top of mh/check-ref-format-3, or it could be inserted in front of this batch (which probably amounts to the same thing :-)
-- Hannes
t/t1402-check-ref-format.sh | 64 +++++++++++++++++++++--------------------- 1 files changed, 32 insertions(+), 32 deletions(-)
t/t1402-check-ref-format.sh +32 -32
@@ -5,38 +5,38 @@ test_description='Test git check-ref-format' . ./test-lib.sh valid_ref() { - if test "$#" = 1 - then - test_expect_success "ref name '$1' is valid" \ - "git check-ref-format '$1'" - else - test_expect_success "ref name '$1' is valid with options $2" \ + prereq= + case $1 in + [A-Z]*) + prereq=$1 + shift + esac + test_expect_success $prereq "ref name '$1' is valid${2:+ with options $2}" \ "git check-ref-format $2 '$1'" - fi } invalid_ref() { - if test "$#" = 1 - then - test_expect_success "ref name '$1' is invalid" \ - "test_must_fail git check-ref-format '$1'" - else - test_expect_success "ref name '$1' is invalid with options $2" \ + prereq= + case $1 in + [A-Z]*) + prereq=$1 + shift + esac + test_expect_success $prereq "ref name '$1' is invalid${2:+ with options $2}" \ "test_must_fail git check-ref-format $2 '$1'" - fi } invalid_ref '' -invalid_ref '/' -invalid_ref '/' --allow-onelevel -invalid_ref '/' --normalize -invalid_ref '/' '--allow-onelevel --normalize' +invalid_ref NOT_MINGW '/' +invalid_ref NOT_MINGW '/' --allow-onelevel +invalid_ref NOT_MINGW '/' --normalize +invalid_ref NOT_MINGW '/' '--allow-onelevel --normalize' valid_ref 'foo/bar/baz' valid_ref 'foo/bar/baz' --normalize invalid_ref 'refs///heads/foo' valid_ref 'refs///heads/foo' --normalize invalid_ref 'heads/foo/' -invalid_ref '/heads/foo' -valid_ref '/heads/foo' --normalize +invalid_ref NOT_MINGW '/heads/foo' +valid_ref NOT_MINGW '/heads/foo' --normalize invalid_ref '///heads/foo' valid_ref '///heads/foo' --normalize invalid_ref './foo'
@@ -115,14 +115,14 @@ invalid_ref "$ref" --refspec-pattern invalid_ref "$ref" '--refspec-pattern --allow-onelevel' ref='/foo' -invalid_ref "$ref" -invalid_ref "$ref" --allow-onelevel -invalid_ref "$ref" --refspec-pattern -invalid_ref "$ref" '--refspec-pattern --allow-onelevel' -invalid_ref "$ref" --normalize -valid_ref "$ref" '--allow-onelevel --normalize' -invalid_ref "$ref" '--refspec-pattern --normalize' -valid_ref "$ref" '--refspec-pattern --allow-onelevel --normalize' +invalid_ref NOT_MINGW "$ref" +invalid_ref NOT_MINGW "$ref" --allow-onelevel +invalid_ref NOT_MINGW "$ref" --refspec-pattern +invalid_ref NOT_MINGW "$ref" '--refspec-pattern --allow-onelevel' +invalid_ref NOT_MINGW "$ref" --normalize +valid_ref NOT_MINGW "$ref" '--allow-onelevel --normalize' +invalid_ref NOT_MINGW "$ref" '--refspec-pattern --normalize' +valid_ref NOT_MINGW "$ref" '--refspec-pattern --allow-onelevel --normalize' test_expect_success "check-ref-format --branch @{-1}" ' T=$(git write-tree) &&
@@ -155,21 +155,21 @@ test_expect_success 'check-ref-format --branch from subdir' ' ' valid_ref_normalized() { - test_expect_success "ref name '$1' simplifies to '$2'" " + test_expect_success $3 "ref name '$1' simplifies to '$2'" " refname=\$(git check-ref-format --normalize '$1') && test \"\$refname\" = '$2'" } invalid_ref_normalized() { - test_expect_success "check-ref-format --normalize rejects '$1'" " + test_expect_success $2 "check-ref-format --normalize rejects '$1'" " test_must_fail git check-ref-format --normalize '$1'" } valid_ref_normalized 'heads/foo' 'heads/foo' valid_ref_normalized 'refs///heads/foo' 'refs/heads/foo' -valid_ref_normalized '/heads/foo' 'heads/foo' +valid_ref_normalized '/heads/foo' 'heads/foo' NOT_MINGW valid_ref_normalized '///heads/foo' 'heads/foo' invalid_ref_normalized 'foo' -invalid_ref_normalized '/foo' +invalid_ref_normalized '/foo' NOT_MINGW invalid_ref_normalized 'heads/foo/../bar' invalid_ref_normalized 'heads/./foo' invalid_ref_normalized 'heads\foo'
Signature · 2 lines
"Atomic objects are neither active nor radioactive." -- Programming Languages -- C++, Final Committee Draft (Doc.N3092)
Re: [PATCH] t1402-check-ref-format: skip tests of refs beginning with slash on Windows
Quoted 3 lines · Johannes Sixt
This patch is needed on top of mh/check-ref-format-3, or it could be inserted in front of this batch (which probably amounts to the same thing :-)
How about applying directly on 'master' then?
Quoted 8 lines
t/t1402-check-ref-format.sh +2
-1+invalid_ref NOT_MINGW '/'@@ -155,21 +155,21 @@ test_expect_success 'check-ref-format --branch from subdir' ' ' valid_ref_normalized() { - test_expect_success "ref name '$1' simplifies to '$2'" " + test_expect_success $3 "ref name '$1' simplifies to '$2'" "
t/t1402-check-ref-format.sh test_expect_success 'check-ref-format --branch from subdir' ' · line 169
Quoted 10 lines
t/t1402-check-ref-format.sh +2
-1refname=\$(git check-ref-format --normalize '$1') && test \"\$refname\" = '$2'" } invalid_ref_normalized() { - test_expect_success "check-ref-format --normalize rejects '$1'" " + test_expect_success $2 "check-ref-format --normalize rejects '$1'" " test_must_fail git check-ref-format --normalize '$1'" } +valid_ref_normalized '/heads/foo' 'heads/foo' NOT_MINGW
The inconsistencies strikes me a bit.
Perhaps update to something like this?
valid_ref_normalized () {
if test $# = 3
then
prereq=$1
shift
fi
test_expect_success $prereq "ref name '$1' simplifies to '$2'"
...
}Re: [PATCH] t1402-check-ref-format: skip tests of refs beginning with slash on Windows
Bash on Windows converts program arguments that look like absolute POSIX paths to their Windows form, i.e., drive-letter-colon format. For this reason, those tests in t1402 that check refs that begin with a slash do not work as expected on Windows: valid_ref tests are doomed to fail, and invalid_ref tests fail for the wrong reason (that there is a colon rather than that they begin with a slash).
Skip these tests.
---
Quoted 5 lines · Junio C Hamano
Review
Quoted 3 lines
(quoted diff) +2
-0+invalid_ref NOT_MINGW '/' +valid_ref_normalized '/heads/foo' 'heads/foo' NOT_MINGWThe inconsistencies strikes me a bit.
Here is what I tentatively will queue.
The interdiff from yours looks like this:
diff --git a/t/t1402-check-ref-format.sh b/t/t1402-check-ref-format.sh
index dba5e97..1ae4d87 100755
--- a/t/t1402-check-ref-format.sh
+++ b/t/t1402-check-ref-format.sh
@@ -11,8 +11,9 @@ valid_ref() {
prereq=$1
shift
esac
- test_expect_success $prereq "ref name '$1' is valid${2:+ with options $2}" \
- "git check-ref-format $2 '$1'"
+ test_expect_success $prereq "ref name '$1' is valid${2:+ with options $2}" "
+ git check-ref-format $2 '$1'
+ "
}
invalid_ref() {
prereq=
@@ -21,8 +22,9 @@ invalid_ref() {
prereq=$1
shift
esac
- test_expect_success $prereq "ref name '$1' is invalid${2:+ with options $2}" \
- "test_must_fail git check-ref-format $2 '$1'"
+ test_expect_success $prereq "ref name '$1' is invalid${2:+ with options $2}" "
+ test_must_fail git check-ref-format $2 '$1'
+ "
}
invalid_ref ''
@@ -155,21 +157,35 @@ test_expect_success 'check-ref-format --branch from subdir' '
'
valid_ref_normalized() {
- test_expect_success $3 "ref name '$1' simplifies to '$2'" "
+ prereq=
+ case $1 in
+ [A-Z]*)
+ prereq=$1
+ shift
+ esac
+ test_expect_success $prereq "ref name '$1' simplifies to '$2'" "
refname=\$(git check-ref-format --normalize '$1') &&
- test \"\$refname\" = '$2'"
+ test \"\$refname\" = '$2'
+ "
}
invalid_ref_normalized() {
- test_expect_success $2 "check-ref-format --normalize rejects '$1'" "
- test_must_fail git check-ref-format --normalize '$1'"
+ prereq=
+ case $1 in
+ [A-Z]*)
+ prereq=$1
+ shift
+ esac
+ test_expect_success $prereq "check-ref-format --normalize rejects '$1'" "
+ test_must_fail git check-ref-format --normalize '$1'
+ "
}
valid_ref_normalized 'heads/foo' 'heads/foo'
valid_ref_normalized 'refs///heads/foo' 'refs/heads/foo'
-valid_ref_normalized '/heads/foo' 'heads/foo' NOT_MINGW
+valid_ref_normalized NOT_MINGW '/heads/foo' 'heads/foo'
valid_ref_normalized '///heads/foo' 'heads/foo'
invalid_ref_normalized 'foo'
-invalid_ref_normalized '/foo' NOT_MINGW
+invalid_ref_normalized NOT_MINGW '/foo'
invalid_ref_normalized 'heads/foo/../bar'
invalid_ref_normalized 'heads/./foo'
invalid_ref_normalized 'heads\foo'Thanks.
t/t1402-check-ref-format.sh | 88 +++++++++++++++++++++++++----------------- 1 files changed, 52 insertions(+), 36 deletions(-)
t/t1402-check-ref-format.sh +52 -36
@@ -5,38 +5,40 @@ test_description='Test git check-ref-format' . ./test-lib.sh valid_ref() { - if test "$#" = 1 - then - test_expect_success "ref name '$1' is valid" \ - "git check-ref-format '$1'" - else - test_expect_success "ref name '$1' is valid with options $2" \ - "git check-ref-format $2 '$1'" - fi + prereq= + case $1 in + [A-Z]*) + prereq=$1 + shift + esac + test_expect_success $prereq "ref name '$1' is valid${2:+ with options $2}" " + git check-ref-format $2 '$1' + " } invalid_ref() { - if test "$#" = 1 - then - test_expect_success "ref name '$1' is invalid" \ - "test_must_fail git check-ref-format '$1'" - else - test_expect_success "ref name '$1' is invalid with options $2" \ - "test_must_fail git check-ref-format $2 '$1'" - fi + prereq= + case $1 in + [A-Z]*) + prereq=$1 + shift + esac + test_expect_success $prereq "ref name '$1' is invalid${2:+ with options $2}" " + test_must_fail git check-ref-format $2 '$1' + " } invalid_ref '' -invalid_ref '/' -invalid_ref '/' --allow-onelevel -invalid_ref '/' --normalize -invalid_ref '/' '--allow-onelevel --normalize' +invalid_ref NOT_MINGW '/' +invalid_ref NOT_MINGW '/' --allow-onelevel +invalid_ref NOT_MINGW '/' --normalize +invalid_ref NOT_MINGW '/' '--allow-onelevel --normalize' valid_ref 'foo/bar/baz' valid_ref 'foo/bar/baz' --normalize invalid_ref 'refs///heads/foo' valid_ref 'refs///heads/foo' --normalize invalid_ref 'heads/foo/' -invalid_ref '/heads/foo' -valid_ref '/heads/foo' --normalize +invalid_ref NOT_MINGW '/heads/foo' +valid_ref NOT_MINGW '/heads/foo' --normalize invalid_ref '///heads/foo' valid_ref '///heads/foo' --normalize invalid_ref './foo'
@@ -115,14 +117,14 @@ invalid_ref "$ref" --refspec-pattern invalid_ref "$ref" '--refspec-pattern --allow-onelevel' ref='/foo' -invalid_ref "$ref" -invalid_ref "$ref" --allow-onelevel -invalid_ref "$ref" --refspec-pattern -invalid_ref "$ref" '--refspec-pattern --allow-onelevel' -invalid_ref "$ref" --normalize -valid_ref "$ref" '--allow-onelevel --normalize' -invalid_ref "$ref" '--refspec-pattern --normalize' -valid_ref "$ref" '--refspec-pattern --allow-onelevel --normalize' +invalid_ref NOT_MINGW "$ref" +invalid_ref NOT_MINGW "$ref" --allow-onelevel +invalid_ref NOT_MINGW "$ref" --refspec-pattern +invalid_ref NOT_MINGW "$ref" '--refspec-pattern --allow-onelevel' +invalid_ref NOT_MINGW "$ref" --normalize +valid_ref NOT_MINGW "$ref" '--allow-onelevel --normalize' +invalid_ref NOT_MINGW "$ref" '--refspec-pattern --normalize' +valid_ref NOT_MINGW "$ref" '--refspec-pattern --allow-onelevel --normalize' test_expect_success "check-ref-format --branch @{-1}" ' T=$(git write-tree) &&
@@ -155,21 +157,35 @@ test_expect_success 'check-ref-format --branch from subdir' ' ' valid_ref_normalized() { - test_expect_success "ref name '$1' simplifies to '$2'" " + prereq= + case $1 in + [A-Z]*) + prereq=$1 + shift + esac + test_expect_success $prereq "ref name '$1' simplifies to '$2'" " refname=\$(git check-ref-format --normalize '$1') && - test \"\$refname\" = '$2'" + test \"\$refname\" = '$2' + " } invalid_ref_normalized() { - test_expect_success "check-ref-format --normalize rejects '$1'" " - test_must_fail git check-ref-format --normalize '$1'" + prereq= + case $1 in + [A-Z]*) + prereq=$1 + shift + esac + test_expect_success $prereq "check-ref-format --normalize rejects '$1'" " + test_must_fail git check-ref-format --normalize '$1' + " } valid_ref_normalized 'heads/foo' 'heads/foo' valid_ref_normalized 'refs///heads/foo' 'refs/heads/foo' -valid_ref_normalized '/heads/foo' 'heads/foo' +valid_ref_normalized NOT_MINGW '/heads/foo' 'heads/foo' valid_ref_normalized '///heads/foo' 'heads/foo' invalid_ref_normalized 'foo' -invalid_ref_normalized '/foo' +invalid_ref_normalized NOT_MINGW '/foo' invalid_ref_normalized 'heads/foo/../bar' invalid_ref_normalized 'heads/./foo' invalid_ref_normalized 'heads\foo'
Signature · 1 line
1.7.7.289.gd0d4bb
Re: [PATCH] t1402-check-ref-format: skip tests of refs beginning with slash on Windows
Am 10/14/2011 1:07, schrieb Junio C Hamano:
Quoted 9 lines
Quoted 5 lines · Junio C Hamano
Review
Quoted 3 lines
(quoted diff) +2
-0+invalid_ref NOT_MINGW '/' +valid_ref_normalized '/heads/foo' 'heads/foo' NOT_MINGWThe inconsistencies strikes me a bit.
Here is what I tentatively will queue.
The patch looks good, and the test cases pass as expected.
Thank you very much,
-- Hannes