Change-Id: Iab7e00cc26a4f9727d3ab98691ef379921a33052 Reviewed-on: https://cl.tvl.fyi/c/depot/+/5240 Tested-by: BuildkiteCI Reviewed-by: kanepyork <rikingcoding@gmail.com> Reviewed-by: Profpatsch <mail@profpatsch.de> Reviewed-by: grfn <grfn@gws.fyi> Reviewed-by: tazjin <tazjin@tvl.su>
		
			
				
	
	
		
			90 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| extern crate git2;
 | ||
| use std::os::unix::ffi::OsStrExt;
 | ||
| use std::path::PathBuf;
 | ||
| 
 | ||
| const DEFAULT_BRANCH: &str = "refs/heads/main";
 | ||
| 
 | ||
| fn main() {
 | ||
|     let git_db_dir = std::env::var_os("GIT_DB_DIR").expect("set GIT_DB_DIR");
 | ||
|     let git_db = PathBuf::from(git_db_dir).join("git");
 | ||
| 
 | ||
|     std::fs::create_dir_all(&git_db).unwrap();
 | ||
| 
 | ||
|     let repo = git2::Repository::init_opts(
 | ||
|         &git_db,
 | ||
|         git2::RepositoryInitOptions::new()
 | ||
|             .bare(true)
 | ||
|             .mkpath(true)
 | ||
|             .description("git-db database")
 | ||
|             .initial_head(DEFAULT_BRANCH),
 | ||
|     )
 | ||
|     .expect(&format!(
 | ||
|         "unable to create or open bare git repo at {}",
 | ||
|         &git_db.display()
 | ||
|     ));
 | ||
| 
 | ||
|     let mut index = repo.index().expect("cannot get the git index file");
 | ||
|     eprintln!("{:#?}", index.version());
 | ||
|     index.clear().expect("could not clean the index");
 | ||
| 
 | ||
|     let now = std::time::SystemTime::now()
 | ||
|         .duration_since(std::time::SystemTime::UNIX_EPOCH)
 | ||
|         .expect("unable to get system time");
 | ||
| 
 | ||
|     let now_git_time = git2::IndexTime::new(
 | ||
|         now.as_secs() as i32, // lol
 | ||
|         u32::from(now.subsec_nanos()),
 | ||
|     );
 | ||
| 
 | ||
|     let data = "hi, it’s me".as_bytes();
 | ||
| 
 | ||
|     index
 | ||
|         .add_frombuffer(
 | ||
|             &git2::IndexEntry {
 | ||
|             mtime: now_git_time,
 | ||
|             ctime: now_git_time,
 | ||
|             // don’t make sense
 | ||
|             dev: 0,
 | ||
|             ino: 0,
 | ||
|             mode: /*libc::S_ISREG*/ 0b1000 << (3+9) | /* read write for owner */ 0o644,
 | ||
|             uid: 0,
 | ||
|             gid: 0,
 | ||
|             file_size: data.len() as u32, // lol again
 | ||
|             id: git2::Oid::zero(),
 | ||
|             flags: 0,
 | ||
|             flags_extended: 0,
 | ||
|             path: "hi.txt".as_bytes().to_owned(),
 | ||
|         },
 | ||
|             data,
 | ||
|         )
 | ||
|         .expect("could not add data to index");
 | ||
| 
 | ||
|     let oid = index.write_tree().expect("could not write index tree");
 | ||
| 
 | ||
|     let to_add_tree = repo
 | ||
|         .find_tree(oid)
 | ||
|         .expect("we just created this tree, where did it go?");
 | ||
| 
 | ||
|     let parent_commits = match repo.find_reference(DEFAULT_BRANCH) {
 | ||
|         Ok(ref_) => vec![ref_.peel_to_commit().expect(&format!(
 | ||
|             "reference {} does not point to a commit",
 | ||
|             DEFAULT_BRANCH
 | ||
|         ))],
 | ||
|         Err(err) => match err.code() {
 | ||
|             // no commit exists yet
 | ||
|             git2::ErrorCode::NotFound => vec![],
 | ||
|             _ => panic!("could not read latest commit from {}", DEFAULT_BRANCH),
 | ||
|         },
 | ||
|     };
 | ||
|     repo.commit(
 | ||
|         Some(DEFAULT_BRANCH),
 | ||
|         &git2::Signature::now("Mr. Authorboy", "author@example.com").unwrap(),
 | ||
|         &git2::Signature::now("Mr. Commiterboy", "committer@example.com").unwrap(),
 | ||
|         "This is my first commit!\n\
 | ||
|          \n\
 | ||
|          I wonder if it supports extended commit descriptions?\n",
 | ||
|         &to_add_tree,
 | ||
|         &parent_commits.iter().collect::<Vec<_>>()[..],
 | ||
|     )
 | ||
|     .expect("could not commit the index we just wrote");
 | ||
| }
 |