Skip to content

Commit

Permalink
test commit
Browse files Browse the repository at this point in the history
  • Loading branch information
podviaznikov committed Nov 25, 2011
1 parent b888787 commit 034160f
Show file tree
Hide file tree
Showing 2 changed files with 330 additions and 0 deletions.
1 change: 1 addition & 0 deletions lib/massive.git.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ sanitize = require("validator").sanitize
validators = require "./validators/input.validators"
utils = require("./objects/utils")

# Dao objects
ReposDao = require "./dao/repos.dao"
UsersDao = require "./dao/users.dao"
CommitsDao = require "./dao/commits.dao"
Expand Down
329 changes: 329 additions & 0 deletions lib/massive.git.coffee~
Original file line number Diff line number Diff line change
@@ -0,0 +1,329 @@
async = require "async"
_ = require "underscore"
sanitize = require("validator").sanitize
validators = require "./validators/input.validators"
utils = require("./objects/utils")

ReposDao = require "./dao/repos.dao"
UsersDao = require "./dao/users.dao"
CommitsDao = require "./dao/commits.dao"
TreesDao = require "./dao/trees.dao"
BlobsDao = require "./dao/blobs.dao"

# Re-export objects.
User = exports.User = require("./objects/user").User
Repo = exports.Repo = require("./objects/repo").Repo
Tree = exports.Tree = require("./objects/tree").Tree
Blob = exports.Blob = require("./objects/blob").Blob
Commit = exports.Commit = require("./objects/commit").Commit
TreeEntry = exports.TreeEntry = require("./objects/tree.entry").TreeEntry


MassiveGit = exports.MassiveGit = class MassiveGit

constructor: (@log = false) ->
@reposDao = ReposDao.newInstance()
@usersDao = UsersDao.newInstance()
@commitsDao = CommitsDao.newInstance()
@treesDao = TreesDao.newInstance()
@blobsDao = BlobsDao.newInstance()

newUser: (username, email, callback) =>
validationResult = validators.validateUser(username, email)
if !validationResult.isValid()
err =
statusCode: 422
message: validationResult.errorMessage
callback err
else
# create user object and save it
[username, email] = validationResult.sanitizedParameters
user = new User username, email
console.log "user to be created", user, validationResult
@usersDao.exists user.id(), (err, exists) =>
if err
err.statusCode = 400
err.message = "Internal error"
callback err
if exists
err =
statusCode: 422
message: "User already exists"
callback err
else
@usersDao.save user, callback

initRepo: (name, author, type, callback) =>
validationResult = validators.validateRepo(name, author)
if !validationResult.isValid()
err =
statusCode: 422
message: validationResult.errorMessage
callback err
else
# create repo object and save it
[name, author] = validationResult.sanitizedParameters
repo = new Repo(name, author, type)
@reposDao.exists repo.id(), (err, exists) =>
if err
err.statusCode = 400
err.message = "Internal error"
callback err
if exists
err =
statusCode: 422
message: "Repo already exists"
callback err
else
@_saveRepo repo, callback

forkRepo: (repoId, name, author, callback) =>
@getRepo repoId, (err, repo) =>
if err
callback err
else
forkedRepo = repo.fork name, author
@_saveRepo forkedRepo, callback

_saveRepo: (repo, callback) =>
@reposDao.save repo, (err, ok) =>
if err
err.message = "Repo wasn't found"
callback err
else
@usersDao.addRepo repo.author, repo.id(), repo.type, (err, ok) ->
if err
err.statusCode = 400
err.message = "User wasn't found"
callback err
else
callback undefined, repo

deleteRepo: (repoId, author, callback) =>
@reposDao.remove repoId, (err, ok) =>
if err
err.statusCode = 400
err.message = "Repo wasn't found"
callback err
else
@usersDao.removeRepo author, repoId, (err, ok) ->
if err
err.message = "User wasn't found"
callback err
else
callback undefined, ok

getUserRepos: (user, callback) => @searchRepos undefined, user, callback

getNewestRepos: (callback) => @reposDao.getNewestRepos callback

searchRepos: (name, author, callback) => @reposDao.search name, author, callback

getUserReposEntries: (user, callback) => @usersDao.fetchAllRepos user, callback

commit: (entries, repoId, author, message = "initial commit", parentCommit = undefined, callback) =>
preparedEntries = @_prepareEntries entries, repoId
tasks = preparedEntries.tasks
treeEntries = preparedEntries.treeEntries
async.series tasks, (err, results) =>
if err
callback err
else
@_prepareTreeAndCommit treeEntries, repoId, parentCommit, author, message, callback

addToIndex: (entries, repoId, author, message = "update", callback) =>
@getHeadTree repoId, (err, tree, commitId) =>
if err
callback err
else
preparedEntries = @_prepareEntries entries, repoId
newEntries = preparedEntries.treeEntries
tasks = preparedEntries.tasks
date = new Date().getTime()
mergedEntries = tree.entries
newEntriesNames = (entry.name for entry in newEntries)
mergedEntries = _.reject mergedEntries, (entry) -> _.include newEntriesNames, entry.name
utils.mergeArrays mergedEntries, newEntries
async.series tasks, (err, results) =>
if err
callback err
else
@_prepareTreeAndCommit mergedEntries, repoId, commitId, author, message, callback

_prepareTreeAndCommit: (treeEntries, repoId, parentCommit, author, message, callback) =>
date = new Date().getTime()
root = new Tree(treeEntries, repoId)
@treesDao.save root, (err, ok) =>
if err
callback err
else
@_prepareAndSaveCommit root, parentCommit, author, date, message, repoId, callback

_prepareAndSaveCommit: (root, parentCommit, author, date, message, repoId, callback) =>
@usersDao.get author, (err, user) =>
if err
callback err
else
commit = new Commit(root.id(), parentCommit, author, user.email, date, author, user.email, date, message, repoId)
@commitsDao.save commit, (err, commit) =>
if err
callback err
else
@_updateRepoCommitRef repoId, commit.id(), (err, resp) ->
if err
callback err
else
callback undefined, commit.id()

_updateRepoCommitRef: (repoId, commitId, callback) =>
@getRepo repoId, (err, repo) =>
if err
callback err
else
repo.commit = commitId
@reposDao.save repo, callback

# Callback takes 3 parameters: err, entries and repo instance.
fetchRepoRootEntriesById: (repoId, callback) =>
@getHead repoId, (err, commitId, repo) =>
if err
callback err
else
@fetchRootEntriesForCommit commitId, (err, entries) ->
if err
callback err
else
callback undefined, entries, repo

# Callback takes 3 parameters: err, commit id and repo instance.
getHead: (repoId, callback) =>
@getRepo repoId, (err, repo) ->
if err
callback err
else
callback undefined, repo.commit, repo

# Callback accepts 3 parameters: error, tree and commit id.
getHeadTree: (repoId, callback) =>
@getHead repoId, (err, commitId) =>
if err
callback err
else
@getHeadTreeFromCommit commitId, callback

# Callback accepts 3 parameters: error, tree and commit id.
getHeadTreeFromCommit: (commitId, callback) =>
@getCommit commitId, (err, commit) =>
if err
callback err
else
treeId = commit.tree
@getTree treeId, (err, tree) ->
if err
callback err
else
callback undefined, tree,commitId

fetchRootEntriesForCommit: (commitId, callback) =>
@getHeadTreeFromCommit commitId,(err, tree) =>
if err
callback err
else
@getBlobs tree.id(), (err, blobs) ->
if err
callback err
else
entries = tree.entries
treeEntries = []
console.log "blobs", blobs
for blob in blobs
blobId = blob.id()
name = entry.name for entry in entries when entry.id == blobId
treeEntries.push new TreeEntry name, blob
callback err, treeEntries

_prepareEntries: (entries, repoId) =>
plainEntries = []
tasks = []
for entry in entries
plainEntries.push entry.attributes()
# todo (anton) trees can be added later
if entry.entry.type == "blob"
blob = entry.entry
blob.repo = repoId
# todo (anton) we can use dao.exists() before saving each blob.
task = async.apply @blobsDao.save, blob
tasks.push task
{tasks: tasks, treeEntries: plainEntries}

getHistoryForRepo: (repoId, callback) =>
@getHead repoId, (err, commitId) =>
if err
callback err
else
@getHistoryForCommit commitId, callback

getHistoryForCommit: (commitId, callback) => @commitsDao.getParents commitId, callback

getBlobs: (treeId, callback) =>
@treesDao.getBlobs treeId, (err, blobs) ->
if err
err.message = "Cannot retrive blobs"
callback err
else
callback undefined, blobs

getRepo: (id, callback) =>
if !id
callback {statusCode: 422, message: "Invalid parameters"}
else
@reposDao.get id, (err, repo) ->
if err
err.statusCode = 400
err.message = "Repo wasn't found"
callback err
else
callback undefined, repo

getBlob: (id, callback) =>
if !id
callback {statusCode: 422, message: "Invalid parameters"}
else
@blobsDao.get id, (err, blob) ->
if err
err.statusCode = 400
err.message = "Blob wasn't found"
callback err
else
callback undefined, blob

getCommit: (id, callback) =>
if !id
callback {statusCode: 422, message: "Invalid parameters"}
else
@commitsDao.get id, (err, commit) ->
if err
err.statusCode = 400
err.message = "Commit wasn't found"
else
callback undefined, commit

getTree: (id, callback) =>
if !id
callback {statusCode: 422, message: "Invalid parameters"}
else
@treesDao.get id, (err, commit) ->
if err
err.statusCode = 400
err.message = "Tree wasn't found"
else
callback undefined, commit

# Factory method to deal with Git Objects
# --------------
# create new tree entry.
createTreeEntry: (name, blob) -> new TreeEntry name, blob

# Create new with provided data.
createBlob: (data, repo, contentType = "application/json") -> new Blob(data, repo, null, contentType)

0 comments on commit 034160f

Please sign in to comment.