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
3412391d
Commit
3412391d
authored
Jul 07, 2011
by
Carlos Martín Nieto
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Intial indexer code
parent
c7c9e183
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
149 additions
and
0 deletions
+149
-0
include/git2.h
+1
-0
include/git2/indexer.h
+15
-0
src/indexer.c
+133
-0
No files found.
include/git2.h
View file @
3412391d
...
...
@@ -60,5 +60,6 @@
#include "git2/net.h"
#include "git2/transport.h"
#include "git2/status.h"
#include "git2/indexer.h"
#endif
include/git2/indexer.h
0 → 100644
View file @
3412391d
#ifndef _INCLUDE_git_indexer_h__
#define _INCLUDE_git_indexer_h__
typedef
struct
git_pack_indexer
{
struct
pack_file
*
pack
;
git_vector
objects
;
git_vector
deltas
;
struct
stat
st
;
}
git_pack_indexer
;
GIT_EXTERN
(
int
)
git_pack_indexer_new
(
git_pack_indexer
**
out
,
const
char
*
packname
);
GIT_EXTERN
(
void
)
git_pack_indexer_free
(
git_pack_indexer
*
idx
)
#endif
src/indexer.c
0 → 100644
View file @
3412391d
/*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2,
* as published by the Free Software Foundation.
*
* In addition to the permissions in the GNU General Public License,
* the authors give you unlimited permission to link the compiled
* version of this file into combinations with other programs,
* and to distribute those combinations without any restriction
* coming from the use of this file. (The General Public License
* restrictions do apply in other respects; for example, they cover
* modification of the file, and distribution when not linked into
* a combined executable.)
*
* This file is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "common.h"
#include "pack.h"
#include "posix.h"
static
int
parse_header
(
git_pack_indexer
*
idx
)
{
struct
pack_header
hdr
;
int
error
;
/* Verify we recognize this pack file format. */
if
((
error
=
p_read
(
idx
->
pack
->
pack_fd
,
&
hdr
,
sizeof
(
hdr
)))
<
GIT_SUCCESS
)
goto
cleanup
;
if
(
hdr
.
hdr_signature
!=
htonl
(
PACK_SIGNATURE
))
{
error
=
git__throw
(
GIT_EOBJCORRUPTED
,
"Wrong pack signature"
);
goto
cleanup
;
}
if
(
!
pack_version_ok
(
hdr
.
hdr_version
))
{
error
=
git__throw
(
GIT_EOBJCORRUPTED
,
"Wrong pack version"
);
goto
cleanup
;
}
/*
* FIXME: At this point we have no idea how many of the are
* deltas, so assume all objects are both until we get a better
* idea
*/
error
=
git_vector_init
(
&
idx
->
objects
,
hdr
.
hdr_entries
,
NULL
/* FIXME: probably need something */
);
if
(
error
<
GIT_SUCCESS
)
goto
cleanup
;
error
=
git_vector_init
(
&
idx
->
deltas
,
hdr
.
hdr_entries
,
NULL
/* FIXME: probably need something */
);
if
(
error
<
GIT_SUCCESS
)
goto
cleanup
;
return
GIT_SUCCESS
;
cleanup:
git_vector_free
(
&
idx
->
objects
);
git_vector_free
(
&
idx
->
deltas
);
return
error
;
}
int
git_pack_indexer_new
(
git_pack_indexer
**
out
,
const
char
*
packname
)
{
struct
git_pack_indexer
*
idx
;
unsigned
int
namelen
;
int
ret
,
error
;
idx
=
git__malloc
(
sizeof
(
struct
git_pack_indexer
));
if
(
idx
==
NULL
)
return
GIT_ENOMEM
;
memset
(
idx
,
0x0
,
sizeof
(
*
idx
));
namelen
=
strlen
(
packname
);
idx
->
pack
=
git__malloc
(
sizeof
(
struct
pack_file
)
+
namelen
+
1
);
if
(
idx
->
pack
==
NULL
)
goto
cleanup
;
memset
(
idx
->
pack
,
0x0
,
sizeof
(
struct
pack_file
));
memcpy
(
idx
->
pack
->
pack_name
,
packname
,
namelen
);
ret
=
p_stat
(
packname
,
&
idx
->
st
);
if
(
ret
<
0
)
{
if
(
errno
==
ENOENT
)
error
=
git__throw
(
GIT_ENOTFOUND
,
"Failed to stat packfile. File not found"
);
else
error
=
git__throw
(
GIT_EOSERR
,
"Failed to stat packfile."
);
goto
cleanup
;
}
ret
=
p_open
(
idx
->
pack
->
pack_name
,
O_RDONLY
);
if
(
ret
<
0
)
{
error
=
git__throw
(
GIT_EOSERR
,
"Failed to open packfile"
);
goto
cleanup
;
}
idx
->
pack
->
pack_fd
=
ret
;
error
=
parse_header
(
idx
);
if
(
error
<
GIT_SUCCESS
)
{
error
=
git__rethrow
(
error
,
"Failed to parse packfile header"
);
goto
cleanup
;
}
*
out
=
idx
;
return
GIT_SUCCESS
;
cleanup:
free
(
idx
->
pack
);
free
(
idx
);
return
error
;
}
void
git_pack_indexer_free
(
git_pack_indexer
*
idx
)
{
p_close
(
idx
->
pack
->
pack_fd
);
git_vector_free
(
&
idx
->
objects
);
git_vector_free
(
&
idx
->
deltas
);
free
(
idx
->
pack
);
free
(
idx
);
}
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