? .completion.db
? .git
? .patch
? drushrc.php
? import.patch
? tmp.patch
? tmp.patch.patch
? tmp.sql
? modules/menu/menu.js
? modules/node/node.diff.inc
? modules/node/node.js
? modules/node/node.pages-diff.inc
? modules/path/path.js
? modules/simpletest/tests/hook_url_rewrite.info
? modules/simpletest/tests/hook_url_rewrite.module
? modules/simpletest/tests/path.test
? modules/upload/upload.js
Index: includes/common.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/common.inc,v
retrieving revision 1.864
diff -u -F^f -p -r1.864 common.inc
--- includes/common.inc	5 Feb 2009 01:21:16 -0000	1.864
+++ includes/common.inc	5 Feb 2009 17:29:39 -0000
@@ -3884,8 +3884,6 @@ function drupal_write_record($table, &$o
     // NOTE: Each table should come with one serial field only.
     if ($info['type'] == 'serial') {
       $serial = $field;
-      // Ignore values for serial when inserting data. Unsupported.
-      unset($object->$field);
     }
 
     // Build arrays for the fields and values in our query.
Index: modules/node/node.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.module,v
retrieving revision 1.1022
diff -u -F^f -p -r1.1022 node.module
--- modules/node/node.module	3 Feb 2009 18:55:30 -0000	1.1022
+++ modules/node/node.module	5 Feb 2009 17:29:40 -0000
@@ -1049,7 +1049,11 @@ function node_submit($node) {
 }
 
 /**
- * Save a node object into the database.
+   * Save changes to a node or add a new node.
+  *
+  * @param $node
+  *   The $node object to be saved. If $node->nid is
+  *   omitted or $node->is_new is TRUE, a new node will be added.
  */
 function node_save(&$node) {
   field_attach_presave('node', $node);
@@ -1057,10 +1061,12 @@ function node_save(&$node) {
   node_invoke_nodeapi($node, 'presave');
   global $user;
 
-  $node->is_new = FALSE;
+  if (!isset($node->is_new)) {
+    $node->is_new = empty($node->nid); 
+  }
 
   // Apply filters to some default node fields:
-  if (empty($node->nid)) {
+  if ($node->is_new) {
     // Insert a new node.
     $node->is_new = TRUE;
 
@@ -1085,6 +1091,7 @@ function node_save(&$node) {
   }
   elseif (!empty($node->revision)) {
     $node->old_vid = $node->vid;
+    unset($node->vid);
   }
   else {
     // When updating a node, avoid clobbering an existing log entry with an empty one.
@@ -1134,9 +1141,12 @@ function node_save(&$node) {
   $function('node', $node);
 
   node_invoke_nodeapi($node, $op);
-
+  
   // Update the node access table for this node.
   node_access_acquire_grants($node);
+  
+  // Clear internal properties.
+  unset($node->is_new);
 
   // Clear the page and block caches.
   cache_clear_all();
Index: modules/node/node.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.test,v
retrieving revision 1.16
diff -u -F^f -p -r1.16 node.test
--- modules/node/node.test	28 Jan 2009 07:34:30 -0000	1.16
+++ modules/node/node.test	5 Feb 2009 17:29:40 -0000
@@ -635,3 +635,55 @@ class NodeRSSContentTestCase extends Dru
     $this->assertText($test_text, t('Extra node content appears in RSS feed.'));
   }
 }
+
+/**
+ * Test case to check node save related functionality, including import-save
+ */
+class NodeSaveTestCase extends DrupalWebTestCase {
+  
+  function getInfo() {
+    return array(
+      'name' => t('Node save'),
+      'description' => t('Test node_save() for saving content.'),
+      'group' => t('Node'),
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+    // Create a user that is allowed to post; we'll use this to test the submission.
+    $web_user = $this->drupalCreateUser(array('create article content'));
+    $this->drupalLogin($web_user);
+    $this->web_user = $web_user;
+  }
+
+  /**
+   * Import test, to check if custom node ids are saved properly.
+   * Workflow: 
+   *  - first create a piece of content
+   *  - save the content
+   *  - check if node exists
+   */
+  function testImport() {
+    // Node ID must be a number that is not in the database.
+    $max_nid = db_result(db_query('SELECT MAX(nid) FROM {node}'));
+    $test_nid = $max_nid + mt_rand(1000, 1000000);
+    $title = $this->randomName(8); 
+    $node = array(
+      'title' => $title,
+      'body' => $this->randomName(32),
+      'uid' => $this->web_user->uid,
+      'type' => 'article',
+      'nid' => $test_nid,
+      'is_new' => TRUE,
+    );
+    $node = (object)$node;
+    node_save($node);
+    // Test the import.
+    $node_by_nid = node_load($test_nid);
+    $this->assertTrue($node_by_nid, t('Node load by node ID.'));
+
+    $node_by_title = $this->drupalGetNodeByTitle($title);
+    $this->assertTrue($node_by_title, t('Node load by node title.'));
+  }
+}
Index: modules/user/user.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/user/user.module,v
retrieving revision 1.962
diff -u -F^f -p -r1.962 user.module
--- modules/user/user.module	3 Feb 2009 18:55:32 -0000	1.962
+++ modules/user/user.module	5 Feb 2009 17:29:40 -0000
@@ -238,7 +238,7 @@ function user_load($array = array()) {
  *
  * @param $account
  *   The $user object for the user to modify or add. If $user->uid is
- *   omitted, a new user will be added.
+ *   omitted (or $user->is_new == TRUE), a new user will be added.
  *
  * @param $edit
  *   An array of fields and values to save. For example array('name'
@@ -283,7 +283,10 @@ function user_save($account, $edit = arr
 
   $edit = (array) $edit;
 
-  if (is_object($account) && $account->uid) {
+  if (!isset($account->is_new)) {
+    $account->is_new = empty($account->uid); 
+  }
+  if (is_object($account) && !$account->is_new) {
     user_module_invoke('update', $edit, $account, $category);
     $data = unserialize(db_result(db_query('SELECT data FROM {users} WHERE uid = %d', $account->uid)));
     // Consider users edited by an administrator as logged in, if they haven't
@@ -295,7 +298,7 @@ function user_save($account, $edit = arr
       // Form fields that don't pertain to the users, user_roles, or
       // Field API are automatically serialized into the users.data
       // column.
-      if ($key != 'roles' && empty($user_fields[$key]) && empty($field_form[$key])) {
+      if (!in_array($key, array('roles', 'is_new')) && empty($user_fields[$key]) && empty($field_form[$key])) {
         if ($value === NULL) {
           unset($data[$key]);
         }
@@ -418,7 +421,7 @@ function user_save($account, $edit = arr
       // Form fields that don't pertain to the users, user_roles, or
       // Field API are automatically serialized into the users.data
       // column.
-      if (($key != 'roles') && (empty($user_fields[$key]) && empty($field_form[$key])) && ($value !== NULL)) {
+      if ((!in_array($key, array('roles', 'is_new'))) && (empty($user_fields[$key]) && empty($field_form[$key])) && ($value !== NULL)) {
         $data[$key] = $value;
       }
     }
Index: modules/user/user.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/user/user.test,v
retrieving revision 1.27
diff -u -F^f -p -r1.27 user.test
--- modules/user/user.test	31 Jan 2009 16:50:57 -0000	1.27
+++ modules/user/user.test	5 Feb 2009 17:29:40 -0000
@@ -962,3 +962,46 @@ class UserBlocksUnitTests extends Drupal
     $this->assertEqual(db_query("SELECT COUNT(*) FROM {sessions} WHERE uid = :uid AND sid = :sid AND timestamp = :timestamp", array(':uid' => $fields['uid'], ':sid' => $fields['sid'], ':timestamp' => $fields['timestamp']))->fetchField(), 1, t('Session record inserted.'));
   }
 }
+
+/**
+ * Test case to test user_save() behaviour.
+ */
+class UserSaveTestCase extends DrupalWebTestCase {
+
+  function getInfo() {
+    return array(
+      'name' => t('User save test'),
+      'description' => t('Test user_save() for arbitrary new uid.'),
+      'group' => t('User'),
+    );
+  }
+
+  /**
+   * Test creating a user with arbitrary uid.
+   */
+  function testUserImport() {
+    // User ID must be a number that is not in the database.
+    $max_uid = db_result(db_query('SELECT MAX(uid) FROM {users}'));
+    $test_uid = $max_uid + mt_rand(1000, 1000000);
+    $test_name = $this->randomName(); 
+
+    // Create the base user, based on drupalCreateUser().
+    $user = array(
+      'name' => $test_name,
+      'uid' => $test_uid,
+      'mail' => $test_name . '@example.com',
+      'is_new' => TRUE,
+      'pass' => user_password(),
+      'status' => 1,
+    );
+    $user_by_return = user_save('', $user);
+    $this->assertTrue($user_by_return, t('Loading user by return of user_save().'));
+
+    // Test if created user exists.
+    $user_by_uid = user_load($test_uid);
+    $this->assertTrue($user_by_uid, t('Loading user by uid.'));
+
+    $user_by_name = user_load(array('name' => $test_name));
+    $this->assertTrue($user_by_name, t('Loading user by name.'));
+  }
+}
