Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
git2
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
git2
Commits
e42ea1f4
Commit
e42ea1f4
authored
Nov 25, 2011
by
Vicent Martí
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #491 from schu/refs-cleanup
reference_rename() cleanup
parents
2869f404
a5cd086d
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
61 additions
and
28 deletions
+61
-28
include/git2/reflog.h
+17
-0
include/git2/refs.h
+5
-0
src/fileops.h
+0
-5
src/reflog.c
+26
-0
src/refs.c
+13
-23
No files found.
include/git2/reflog.h
View file @
e42ea1f4
...
@@ -51,6 +51,23 @@ GIT_EXTERN(int) git_reflog_read(git_reflog **reflog, git_reference *ref);
...
@@ -51,6 +51,23 @@ GIT_EXTERN(int) git_reflog_read(git_reflog **reflog, git_reference *ref);
GIT_EXTERN
(
int
)
git_reflog_write
(
git_reference
*
ref
,
const
git_oid
*
oid_old
,
const
git_signature
*
committer
,
const
char
*
msg
);
GIT_EXTERN
(
int
)
git_reflog_write
(
git_reference
*
ref
,
const
git_oid
*
oid_old
,
const
git_signature
*
committer
,
const
char
*
msg
);
/**
/**
* Rename the reflog for the given reference
*
* @param ref the reference
* @param new_name the new name of the reference
* @return GIT_SUCCESS or an error code
*/
GIT_EXTERN
(
int
)
git_reflog_rename
(
git_reference
*
ref
,
const
char
*
new_name
);
/**
* Delete the reflog for the given reference
*
* @param ref the reference
* @return GIT_SUCCESS or an error code
*/
GIT_EXTERN
(
int
)
git_reflog_delete
(
git_reference
*
ref
);
/**
* Get the number of log entries in a reflog
* Get the number of log entries in a reflog
*
*
* @param reflog the previously loaded reflog
* @param reflog the previously loaded reflog
...
...
include/git2/refs.h
View file @
e42ea1f4
...
@@ -183,6 +183,11 @@ GIT_EXTERN(int) git_reference_set_oid(git_reference *ref, const git_oid *id);
...
@@ -183,6 +183,11 @@ GIT_EXTERN(int) git_reference_set_oid(git_reference *ref, const git_oid *id);
* If the `force` flag is not enabled, and there's already
* If the `force` flag is not enabled, and there's already
* a reference with the given name, the renaming will fail.
* a reference with the given name, the renaming will fail.
*
*
* IMPORTANT:
* The user needs to write a proper reflog entry if the
* reflog is enabled for the repository. We only rename
* the reflog if it exists.
*
* @param ref The reference to rename
* @param ref The reference to rename
* @param new_name The new name for the reference
* @param new_name The new name for the reference
* @param force Overwrite an existing reference
* @param force Overwrite an existing reference
...
...
src/fileops.h
View file @
e42ea1f4
...
@@ -90,11 +90,6 @@ extern int git_futils_rmdir_r(const char *path, int force);
...
@@ -90,11 +90,6 @@ extern int git_futils_rmdir_r(const char *path, int force);
extern
int
git_futils_mktmp
(
char
*
path_out
,
const
char
*
filename
);
extern
int
git_futils_mktmp
(
char
*
path_out
,
const
char
*
filename
);
/**
/**
* Atomically rename a file on the filesystem
*/
extern
int
git_futils_mv_atomic
(
const
char
*
from
,
const
char
*
to
);
/**
* Move a file on the filesystem, create the
* Move a file on the filesystem, create the
* destination path if it doesn't exist
* destination path if it doesn't exist
*/
*/
...
...
src/reflog.c
View file @
e42ea1f4
...
@@ -255,6 +255,32 @@ int git_reflog_write(git_reference *ref, const git_oid *oid_old,
...
@@ -255,6 +255,32 @@ int git_reflog_write(git_reference *ref, const git_oid *oid_old,
return
reflog_write
(
log_path
,
old
,
new
,
committer
,
msg
);
return
reflog_write
(
log_path
,
old
,
new
,
committer
,
msg
);
}
}
int
git_reflog_rename
(
git_reference
*
ref
,
const
char
*
new_name
)
{
char
old_path
[
GIT_PATH_MAX
];
char
new_path
[
GIT_PATH_MAX
];
git_path_join_n
(
old_path
,
3
,
ref
->
owner
->
path_repository
,
GIT_REFLOG_DIR
,
ref
->
name
);
git_path_join_n
(
new_path
,
3
,
ref
->
owner
->
path_repository
,
GIT_REFLOG_DIR
,
new_name
);
return
p_rename
(
old_path
,
new_path
);
}
int
git_reflog_delete
(
git_reference
*
ref
)
{
char
path
[
GIT_PATH_MAX
];
git_path_join_n
(
path
,
3
,
ref
->
owner
->
path_repository
,
GIT_REFLOG_DIR
,
ref
->
name
);
if
(
git_futils_exists
(
path
))
return
GIT_SUCCESS
;
return
p_unlink
(
path
);
}
unsigned
int
git_reflog_entrycount
(
git_reflog
*
reflog
)
unsigned
int
git_reflog_entrycount
(
git_reflog
*
reflog
)
{
{
assert
(
reflog
);
assert
(
reflog
);
...
...
src/refs.c
View file @
e42ea1f4
...
@@ -10,6 +10,7 @@
...
@@ -10,6 +10,7 @@
#include "repository.h"
#include "repository.h"
#include "fileops.h"
#include "fileops.h"
#include "pack.h"
#include "pack.h"
#include "reflog.h"
#include <git2/tag.h>
#include <git2/tag.h>
#include <git2/object.h>
#include <git2/object.h>
...
@@ -1319,28 +1320,6 @@ int git_reference_rename(git_reference *ref, const char *new_name, int force)
...
@@ -1319,28 +1320,6 @@ int git_reference_rename(git_reference *ref, const char *new_name, int force)
}
}
/*
/*
* Crude hack: delete any logs till we support proper reflogs.
* Otherwise git.git will possibly fail and leave a mess. git.git
* writes reflogs by default in any repo with a working directory:
*
* "We only enable reflogs in repositories that have a working directory
* associated with them, as shared/bare repositories do not have
* an easy means to prune away old log entries, or may fail logging
* entirely if the user's gecos information is not valid during a push.
* This heuristic was suggested on the mailing list by Junio."
*
* Shawn O. Pearce - 0bee59186976b1d9e6b2dd77332480c9480131d5
*
* TODO
*
*/
git_path_join_n
(
aux_path
,
3
,
ref
->
owner
->
path_repository
,
"logs"
,
ref
->
name
);
if
(
git_futils_isfile
(
aux_path
)
==
GIT_SUCCESS
)
{
if
((
error
=
p_unlink
(
aux_path
))
<
GIT_SUCCESS
)
goto
rollback
;
}
/*
* Finally we can create the new reference.
* Finally we can create the new reference.
*/
*/
if
(
ref
->
flags
&
GIT_REF_SYMBOLIC
)
{
if
(
ref
->
flags
&
GIT_REF_SYMBOLIC
)
{
...
@@ -1352,7 +1331,7 @@ int git_reference_rename(git_reference *ref, const char *new_name, int force)
...
@@ -1352,7 +1331,7 @@ int git_reference_rename(git_reference *ref, const char *new_name, int force)
}
}
if
(
error
<
GIT_SUCCESS
)
if
(
error
<
GIT_SUCCESS
)
goto
cleanup
;
goto
rollback
;
/*
/*
* Check if we have to update HEAD.
* Check if we have to update HEAD.
...
@@ -1372,6 +1351,14 @@ int git_reference_rename(git_reference *ref, const char *new_name, int force)
...
@@ -1372,6 +1351,14 @@ int git_reference_rename(git_reference *ref, const char *new_name, int force)
}
}
/*
/*
* Rename the reflog file.
*/
git_path_join_n
(
aux_path
,
3
,
ref
->
owner
->
path_repository
,
GIT_REFLOG_DIR
,
ref
->
name
);
if
(
git_futils_exists
(
aux_path
)
==
GIT_SUCCESS
)
error
=
git_reflog_rename
(
ref
,
new_name
);
/*
* Change the name of the reference given by the user.
* Change the name of the reference given by the user.
*/
*/
git__free
(
ref
->
name
);
git__free
(
ref
->
name
);
...
@@ -1398,6 +1385,9 @@ rollback:
...
@@ -1398,6 +1385,9 @@ rollback:
error
=
git_reference_create_oid
(
error
=
git_reference_create_oid
(
NULL
,
ref
->
owner
,
ref
->
name
,
&
ref
->
target
.
oid
,
0
);
NULL
,
ref
->
owner
,
ref
->
name
,
&
ref
->
target
.
oid
,
0
);
/* The reference is no longer packed */
ref
->
flags
&=
~
GIT_REF_PACKED
;
return
error
==
GIT_SUCCESS
?
return
error
==
GIT_SUCCESS
?
git__rethrow
(
GIT_ERROR
,
"Failed to rename reference. Did rollback"
)
:
git__rethrow
(
GIT_ERROR
,
"Failed to rename reference. Did rollback"
)
:
git__rethrow
(
error
,
"Failed to rename reference. Failed to rollback"
);
git__rethrow
(
error
,
"Failed to rename reference. Failed to rollback"
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment